为什么AutoMapper关心我的访问者(公共与内部)?

时间:2012-05-27 18:15:49

标签: c# wcf automapper

我(或者,很快,将会)使用AutoMapper将一堆业务对象映射到一堆WCF DTO。这似乎是一个不错的技巧 - 在.CreateMap级别进行了大量的故障排除,但总体上觉得值得。直到我决定将我的业务逻辑隐藏在程序集之外。

BO和映射器生活在同一个项目中;他们分离外部装配DTO,public(并且无论如何都需要通过通道)。没有必要公开BO,因为DTO现在可以完成这项工作,所以我想我会将他们的访问者重置为internal。 Kaboom自动化。举例说明:

(来自BLL的代码,与AutoMapping相同)

public class TestObject
{
    private int _myID;
    public int MyID
    {
        get { return _myID; }
        set { _myID = value; }
    }
}

(来自服务层的代码)

public class TestObjectDTO
{
    private int _myID;
    public int MyID
    {
        get { return _myID; }
        set { _myID = value; }
    }
}

这将起作用

Mapper.CreateMap<TestObject, TestObjectDTO>();

直到我这样做:

internal class TestObject
...

,甚至只是这个,在TestObject

internal int MyID

任何人都可以向我解释这个吗?我不会把它称为“错误”,但它似乎与基于反射的映射的整个目的相矛盾,即允许不同目的的对象一起流畅地扩展。为什么AM不能处理映射,让我控制访问器?

2 个答案:

答案 0 :(得分:0)

这是By Design。有两个选项要么使用您自己的解析器,它们可以使用(私有,受保护,内部等)或映射到接口并使用显式接口实现。

这两种方法都包含在之前SO线程的答案中:

How can I use AutoMapper on properties marked Internal?

答案 1 :(得分:-1)

来自MSDN

The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly

IE,标记为内部的任何内容只能由项目中的代码访问 - 这意味着引用的程序集(如AutoMapper)甚至看不到标记为内部的内容。基于反射的映射需要公共类和公共get / set属性。