嵌入式类型的属性的“使用”类型配置

时间:2011-11-28 07:19:04

标签: c# .net automapper

考虑我上下传递的这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手动显式指定所有属性。能够为如何映射指定一种“使用”语句将是一个真正的节省时间(并且不易出错)。

我想你可以称之为“通过暗示投影”: - )

这目前可能吗?

1 个答案:

答案 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 } ));