AutoMapper:将接口映射到抽象类 - 这可能吗?

时间:2011-04-07 08:38:48

标签: c# interface abstract-class automapper

我正在使用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 ...

我希望有人能为我指出正确的方向! 谢谢!

2 个答案:

答案 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)

如果是这样,那么你想要映射到那个工厂,注入它并让它在适当的时候创建正确的实例,因为它显然知道要实例化的工厂。