我正在使用AutoMapper在我的应用程序的不同层之间映射对象。 一方面,我有一个界面,如下所示:
public interface MyRepo
{
IEnumerable<IRootObject> 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<IRootObject, MyCustomRoot>
.Include<IFirstSubObject, MyCustomFirstSub>
.Include<ISecondSubObject, MyCustomSecondSub>();
AutoMapper.Mapper.CreateMap<IFirstSubObject, MyCustomFirstSub>();
AutoMapper.Mapper.CreateMap<ISecondSubObject, MyCustomSecondSub>();
但是我一直在获取MapperExceptions(“不能构造抽象类”,这在某种程度上是有意义的)。我也打电话给AssertConfigurationIsValid
,然后传递此代码。
如果我没有使MyCustomRoot
类抽象,那么映射有效,但我得到了MyCustomRoot
个对象的列表,而我实际上希望有一个MyCustomxxxSub
的列表,因为稍后有一个Factory使用此类型生成正确的UI ...
我希望有人能为我指出正确的方向! 谢谢!
答案 0 :(得分:7)
好的,我找到了实际做到这一点的方法!
因此,通过上面提供的接口和类,您可以执行类似的操作
(请记住:MyCustomRoot
类是抽象的)
AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
.Include<IFirstSubObject, MyCustomFirstSub>
.Include<ISecondSubObject, MyCustomSecondSub>();
然后使用followig Map调用来映射对象:
public List<MyCustomRoot> PerformMapping(List<IRootObject> rootObjects)
{
var returnList = new List<CustomRoot>();
foreach(var rootObject in rootObjects)
{
var abstractObject = (MyCustomRoot)Mapper.Map(rootObject, rootObject.GetType(), typeof(MyCustomRoot));
returnList.Add(abstractObject);
}
return returnList;
}
现在我实际上得到了一组MyCustomRoot
个对象,这些对象都是具体的实现。
这正是我所寻找的!
答案 1 :(得分:0)
如果是这样,那么你想要映射到那个工厂,注入它并让它在适当的时候创建正确的实例,因为它显然知道要实例化的工厂。