我们一直在使用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中。
谢谢。