我的用例很简单。我有一个引用子对象的根域对象。我有一个DTO从表示域对象的服务调用传回,但不是每次都传递子对象,DTO包含一个保存子对象的键值的属性。像这样:
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实例。这是否需要自定义值解析器,还是有其他方法可以实现此目的?
答案 0 :(得分: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
的任何位置使用它