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

4

我们已经使用Automapper一段时间了,认为它是一个很棒的工具,感谢您的创造!

但是,我们有一个问题:

问题

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

背景

在我们的分层架构中,Dto对象从不离开数据访问层,只有域对象被允许在数据访问层内外传递。因此,从域的角度来看,域对象不应包含任何数据库知识。然而,在现实中,数据库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; }
}

在我们的Profile类中,我们有CreateMap<PersonDto,Person>();编辑1 - 修复了Father返回类型中的一个拼写错误。 编辑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;

整个重点是,我们不希望业务开发人员从Business.Dll访问son.FatherId,也不允许他们访问创建领域对象的Dto对象。
因此,所有“数据库”知识都封装在各种Common.dll服务或DataAccess.dll中。
谢谢。
1个回答

5

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

以下是答案摘录:

只需在初始化方法中设置配置对象的ShouldMapProperty属性即可。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接