2016-03-20 67 views
1

我们一直在使用Automapper,并且我们认为这是非常棒的实用工具,感谢您创建它!如何使用Automapper映射到内部属性?

但是,我们有一个问题:

问题

“你怎么配置AutoMapper到源属性映射到内部目的地的财产?”

背景

在我们的分层架构中,DTO对象永远不会离开数据访问层,只有域对象可以进出通过数据访问层。因此,从域POV中,域对象不应包含任何数据库知识。但是,实际上数据库ID是非常有用的 - 预计'业务层'开发人员不应该知道它们。

解决方案:将数据库ID添加到域对象,但将它们作为内部销售,以便它们不会暴露于“业务层”。接下来将公共层(拥有域对象)内部公开给数据访问层。问题解决了。预计我们无法弄清楚如何让Automapper(> v3.3.0)与我们的内部属性一起工作。

在,版本3.3.0 BindingFlags被暴露,用来解决问题。

Common.Dll

public class Person 
{ 
    public Parent Father { get; set; } 
    internal int FatherId {get; private set; } 
} 

DataAccess.dll

internal class PersonDto 
{ 
    public ParentDto Father { get; set; } 
    public int FatherId {get; private set; } 
} 

在我们的档案类,所以必须CreateMap<PersonDto, Person>();

编辑1 - 修正了父类返回类型的错字。

编辑2 - 增加了更多的信息.​​.

在Common.Dll,我们有服务是这样的:

public class ParentService 
{ 
    public Parent GetFather(Person person) 
    { 
     return repo.Parents.FirstOrDefault(parent => parent.Id = person.Father.Id); 
    } 
} 

而在Business.Dll我们有开发者的使用服务这样的事情:

var father = parentService.GetFather(son); 
// use father separately or assign it to the son. Like so: 
// son.Father = father; 

重点是,我们不希望业务开发人员有权访问来自Businssess.Dll的也不能访问创建域对象的Dto对象。因此,所有'数据库'知识都封装在各种Common.dll服务或DataAccess.dll中。

谢谢。

回答

0

这个问题的答案是here

我引用的答案为您提供便利:

只需设置你的配置对象 的ShouldMapProperty财产initialize方法。

下面是一个使用静态API的示例,但是,您应该能够通过使用非静态API以类似的方式实现 。

Mapper.Initialize(i => 
{ 
    i.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly; 
    i.CreateMap<Source, Target>();     
}); 
相关问题