2011-05-10 42 views
2

我的用例很簡單。我有一個引用子對象的根域對象。我有一個代表域對象的服務調用傳回的DTO,但不是每次都傳遞子對象,DTO包含一個包含子對象的鍵值的屬性。這樣的事情:如何使用AutoMapper根據鍵值分配參考?

public class DomainObject 
{ 
    public ChildObject Child { get; set; } 
    public String Name { get; set; } 
} 

public class ChildObject 
{ 
    public Int32 Key { get; set; } 
    public String Name { get; set; } 
} 

public class DTO 
{ 
    public Int32 ChildKey { get; set; } 
    public String Name { get; set; }  
} 

我有一個緩存的ChildObjects列表。當我從DTO => DomainObject映射時,我想使用DTO.ChildKey屬性將DomainObject.Child屬性設置爲緩存中現有的ChildObject實例。這是否需要一個自定義的值解析器還是有另一種方法來實現這一點?

回答

1

是的,你需要一個自定義的值解析器。像這樣的東西會做:

public class KeyToChildObjectResolver : ValueResolver<Int32, ChildObject> 
{ 
    protected override ChildObject ResolveCore(Int32 source) 
    { 
     return Cache.Get<ChildObject>(source); 
    } 
} 

然後:

Mapper.CreateMap<DTO, DomainObject>() 
     .ForMember(x => x.Child, o => o.ResolveUsing<KeyToChildObjectResolver>() 
            .FromMember(x => x.ChildKey)); 

你可以與徑直從DTO到ChildObject但隨後你的解析器基本上是單一目的的解析器做到這一點。通過這種方式,您可以在任何有孩子密鑰的地方將其用於映射到ChildObject