2009-11-09 86 views
2

我試圖使用AutoMapper從DTO的映射到自己的網域的ISet NHibernate的映射到IList中。如何簡單地使用AutoMapper

我的DTO的可能是這樣的:

public class MyDTO 
{ 
    public string Name { get; set; } 
    public bool OtherProperty { get; set; } 

    public ChildDTO[] Children { get; set;} 
} 

public class ChildDTO 
{ 
    public string OtherName { get; set; } 
} 

我的域對象是這樣的:

public class MyDomain 
{ 
    public string Name { get; set; } 
    public bool OtherProperty { get; set; } 
    public ISet<ChildDomain> Children { get; set; } 
} 

public class ChildDomain 
{ 
    public string OtherName { get; set; } 
} 

我將如何設置AutoMapper要能夠從這些陣列的映射設置的。看起來像AutoMapper正在使用Array並將它們轉換爲IList,然後在轉換爲ISet時失敗。

這裏的

Unable to cast object of type 'System.Collections.Generic.List`1[DataTranser.ChildDTO]' to type 'Iesi.Collections.Generic.ISet`1[Domain.ChildDomain]'. 

我希望能找到一個簡單通用的方法來做到這一點,這樣我可以儘量減少從DTO對域圖所需的基礎設施除外。任何幫助是極大的讚賞。



UPDATE:
於是我將如何模型MYDOMAIN - > ChildDomain而不貧血的域模型結束了?我明白,如果沒有MyDomain或ChildDomain中的業務邏輯,領域模型目前處於貧困狀態,但目標是在我們前進時添加業務邏輯。我只想確保我的視圖模型可以轉換爲域模型並保持。

你會建議這個方案是什麼,從視野和領域,後來在業務規則之間加入一個簡單的映射移動?再次

感謝您的幫助。

+0

而你的automapper配置是...? – Paco 2009-11-09 19:42:33

+0

映射僅針對單個項目進行定義: Mapper.CreateMap (); Mapper.CreateMap (); 不知道如何去創建Set的映射,這是問題的基本前提。感謝您的幫助。 – Kas 2009-11-09 20:14:18

+0

我確實嘗試了Mapper.CreateMap (),並且以例外 – Kas 2009-11-09 20:29:31

回答

1

答案:

  1. 你必須創建自己的IObjectMapper映射自定義集合像ISet的
  2. 與所有的標準 objectmappers和新 setobjectmapper創建自己的配置實例。
  3. 使用與配置創建一個IMappingEngine實例與 自己objectmapper而不是 靜態AutoMapper.Mapper類。

一些言論:

  • 可以很容易地配置IMappingEngine建設控制容器的反轉。
  • automapper本身的來源可能會幫助您創建IObjectMapper實現。
  • 您正在使用automapper對什麼它是專爲相反的方式:它的設計,簡單對象的複雜對象映射。您嘗試將簡單的DTO映射到複雜的實體。 (這並不意味着你想要的東西是很難用automapper的事,但你可能會在未來有不同的問題)
  • 您使用的是貧血域模型反模式。域名應該持有所有的業務邏輯,所以它不應該讓像ISet的一個複雜的集合(和所有沒有公共setter方法的集合)
4

如果你的持久層很簡單,用UseDestinationValue()會告訴AutoMapper不更換底層集合:

ForMember(DEST => dest.Children,選擇=> opt.UseDestinationValue())

但是,如果它不是簡單的,我們只是做了更新手動回域。邏輯通常變得更復雜以更新域模型。做反向映射會限制您的域模型的形狀,您可能不想要這種形狀。

+0

得到了同樣的問題:一個簡單的ISet 。我的DTO中的值是空的(null),正因爲如此,我認爲他讓它成爲一個IList。 有很多希望我嘗試了上面的代碼行,但它仍然在這裏給出了相同的錯誤。 – Gigi2m02 2012-08-19 23:40:07