繁体   English   中英

如何使用 Automapper 映射到内部属性?

[英]How to map to internal properties using Automapper?

我们已经使用 Automapper 有一段时间了,我们认为它非常实用,感谢您创建它!

但是,我们有一个问题:

“如何配置 AutoMapper 以将源属性映射到内部目标属性?”

背景

在我们的分层架构中,Dto 对象永远不会离开数据访问层,只允许域对象进出数据访问层。 因此,从域 POV 来看,域对象不应该包含任何数据库知识。 然而,实际上数据库 ID 非常有用,可以随身携带 - 预计“业务层”开发人员不应该知道它们。

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

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

例子

通用文件名

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

数据访问文件

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

在我们的 Profile 类中,我们有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;

重点是,我们不希望业务开发人员可以访问son.FatherId中的 son.FatherId,也不希望他们访问创建域对象的 Dto 对象。

因此,所有“数据库”知识都封装在各种 Common.dll 服务或 DataAccess.dll 中。

谢谢。

这个问题在这里得到解答。

为了您的方便,我引用答案:

只需在 initialize 方法中设置配置对象的 ShouldMapProperty 属性。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM