考虑我上下传递的这3个简化示例类型(我实际上只在DomainObject和WrapperClass之间自动化):
public class DomainObject
{
public int Prop1 {get;set;}
public int Prop2 {get;set;}
public int ComputedValue1 {get;set;}
public int ComputedValue2 {get;set;}
}
public class DALEntity
{
public int Prop1 {get;set;}
public int Prop2 {get;set;}
}
public class Wrapper
{
public DALEntity ToFromDB {get;set;}
public int ComputedValue1 {get;set;}
public int ComputedValue2 {get;set;}
}
DomainObject是我的大多数应用程序处理的内容,而DALEntity是我的数据访问层在处理数据库时处理的内容。请注意,有(在这种情况下)2个计算值不会被持久化 - 而是在外部计算(对于这个例子并不重要)。因此,我宁愿不将它们包括在我的DALEntity中。
对于向上映射(src == DALEntity,dest == DomainObject),我想告诉Automapper,对于DomainObject中的任何字段,它都不知道如何填充,“在这个复杂属性中查找名称匹配的属性” 。据我所知,现在,我需要在创建映射时通过MapFrom手动显式指定所有属性。能够为如何映射指定一种“使用”语句将是一个真正的节省时间(并且不易出错)。
我想你可以称之为“通过暗示投影”: - )
这目前可能吗?
答案 0 :(得分:0)
我会将计算属性的计算移动到它自己的类。然后,您可以使用依赖注入,并使计算属性调用注入的类来填充自己。 AutoMapper不应该知道这一点。 DO应该知道它需要什么才能完全运行,或者,除非它应该是它的工厂。
这也会增加班级的可测试性。
无论如何,如果你仍然想要走这条路线,你可以将一个函数传递给Automapper的映射方法。
类似的东西:
Mapper.CreateMap<DAL, DO>()
.ForMember(m => m.CalcProp,
opt => opt.MapFrom(src =>
{ anon function that calls calculating code, passing src } ));