AutoMapper:将接口映射到抽象类 – 这可能吗?
我正在使用AutoMapper在我的应用程序的不同层之间映射对象。 一方面我有一个如下所示的界面:
public interface MyRepo { IEnumerable GetItems(param); }
IRootObject看起来像这样:
public interface IRootObject { int Id { get; set; } DateTime? Date { get; set; } } public interface IFirstSubObject : IRootObject { string MyFirstProp { get; set; } } public interface ISecondSubObject : IRootObject { string MySecondProp { get; set; } }
所以GetItems()
调用实际上只返回一个IxxxSubObjectItems
数组。 另一方面,结构如下所示:
public abstract class MyCustomRoot { protected MyCustomRoot(){} public int Id { get; set; } public DateTime? Date { get; set; } } public class MyCustomFirstSub : MyCustomRoot { public MyCustomFirstSub() : base() {} public string MyFirstProp { get; set; } } public class MyCustomSecondSub : MyCustomRoot { public MyCustomSecondSub () : base() {} public string MySecondProp { get; set; } }
现在我已经像这样设置了映射器
AutoMapper.Mapper.CreateMap .Include .Include(); AutoMapper.Mapper.CreateMap(); AutoMapper.Mapper.CreateMap();
但我继续得到MapperExceptions(“不能构造抽象类”,这在某种程度上是有道理的)。 我也调用AssertConfigurationIsValid
,并传递此代码。
如果我不使MyCustomRoot
类抽象,那么映射可以工作,但我得到一个MyCustomRoot
对象列表,而我实际上想要一个MyCustomxxxSub
列表,因为稍后有一个Factory使用这个类型生成正确的用户界面……
我希望有人可以指出我正确的方向!
谢谢!
好的,我找到了实际做到这一点的方法! 因此,使用上面提供的接口和类,您可以执行类似的操作
(记住: MyCustomRoot
类是抽象的)
AutoMapper.Mapper.CreateMap .Include .Include();
然后使用followig Map调用来映射对象:
public List PerformMapping(List rootObjects) { var returnList = new List(); foreach(var rootObject in rootObjects) { var abstractObject = (MyCustomRoot)Mapper.Map(rootObject, rootObject.GetType(), typeof(MyCustomRoot)); returnList.Add(abstractObject); } return returnList; }
现在我实际上获得了一个MyCustomRoot
对象数组,这些对象都是特定的实现。
这正是我想要的!
如果是这样,那么你想映射到那个工厂,注入它并让它在适当的时候创建正确的实例,因为它显然知道要实例化的工厂。