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

时间:2016-03-20 02:44:43

标签: c# automapper-4

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

但是,我们有一个问题:

问题

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

背景

在我们的分层架构中,Dto对象永远不会离开数据访问层,只允许域对象进出数据访问层。因此,从域POV,域对象不应包含任何数据库知识。然而,实际上数据库ID非常有用 - 期待商业层'开发人员不应该了解他们。

解决方案:将数据库ID添加到域对象,但将其作为内部对象销售,以便它们不会暴露给业务层'。接下来,将公共图层(拥有域对象)内部暴露给数据访问层。问题解决了。期望我们无法弄清楚如何使用Automapper(> v3.3.0)来处理我们的内部属性。

In,版本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访问son.FatherId,也无法访问创建域对象的Dto对象。

因此,所有的数据库&#39;知识封装在各种Common.dll服务或DataAccess.dll中。

感谢。

1 个答案:

答案 0 :(得分:1)

这个问题已经回答here

为方便起见,我引用了答案:

  

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

     

以下是使用静态API的示例,但您应该可以   通过使用非静态API以类似的方式实现相同的目的。

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