2011-11-28 62 views
0

考虑我通过了这3种简单例子类型和下(i 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),Id喜欢告诉Automapper,对于DomainObject中的任何字段,它不知道如何填充,“在这个复杂属性中寻找名称匹配的属性”。据我了解,现在,我需要在创建映射时通过MapFrom手动显式指定所有属性。将是一个真正的定时器(并且不太容易出错)能够指定一种“使用”语句来进行映射。

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

这是目前可能吗?

回答

0

我会将计算的属性的计算移动到它自己的类中。然后你可以使用依赖注入并让计算出的属性调用注入的类来填充它们自己。 AutoMapper不应该知道这一点。 DO应该意识到它需要完全运作,或者除此之外,它的工厂应该。

这也会增加该类的可测试性。

无论如何,如果你仍然想走这条路线,你可以将一个函数传递给Automapper的映射方法。

喜欢的东西:

Mapper.CreateMap<DAL, DO>() 
       .ForMember(m => m.CalcProp, 
          opt => opt.MapFrom(src => 
          { anon function that calls calculating code, passing src }));