1

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

BO 和 mapper 生活在同一个项目中;他们剥离了外部组件 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 不能处理映射,让我控制访问器?

4

2 回答 2

0

这是设计。有几个选项是使用您自己的解析器,它将与那些(私有、受保护、内部等)一起使用,或者映射到接口并使用显式接口实现。

前一个 SO 线程的答案涵盖了这两种方法:

如何在标记为内部的属性上使用 AutoMapper?

于 2012-05-27T18:50:20.210 回答
-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, anything marked as internal can only be accessed by the code in your project - which means referenced assemblies such as AutoMapper cannot even see things marked as internal. Reflection based mappings require a public class, and public get / set properties.

于 2012-05-27T18:29:11.183 回答