2011-04-07 81 views
4

我使用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,因爲有一個工廠後來使用這種類型以生成正確的用戶界面...

我希望有人能指出我在這個正確的方向!
謝謝!

回答

7

好吧,我找到了一種方法來實際做到這一點! 因此,與上面所提供的接口和類,你可以做這樣的事情
(記住:MyCustomRoot是一個抽象類)

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot> 
    .Include<IFirstSubObject, MyCustomFirstSub> 
    .Include<ISecondSubObject, MyCustomSecondSub>(); 

,然後使用followig地圖調用對象映射:

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

您能否更具體地說明您的問題與代碼有何不同?我嘗試過,但仍然有「抽象類不能創建」的例外... – guillaume31 2016-06-01 09:49:05

+0

好吧,似乎版本4.x不起作用,但3.2。奇怪的。 – guillaume31 2016-06-01 13:13:31

0

如果是這樣,那麼你想映射到該工廠,注入它,並讓它在適當的時候創建正確的實例,因爲它是明顯知道實例化的工廠。

+0

呃,不是真的。工廠在另一個層面,並且它被作爲輸入抽象爲'MyCustomRoot'對象。無論如何感謝您的幫助! – RoelF 2011-04-07 09:16:22