6

我有一个 WCF 服务,并且刚刚为一个业务对象创建了一个 DTO。

我的问题是在哪里放置两者之间的映射?

A) 在 DTO 中?

public class PersonDTO
{
    [DataMember] public string Id              { get; set; }
    [DataMember] public string Name            { get; set; }

    public void CloneFrom(Person p)
    {
        Id   = p.Id;
        Name = p.Name;
    }

    public void Populate(Person p)
    {
        p.Id   = Id;
        p.Name = Name;
    }
}

或者

B) 在业务对象中?

public class Person
{
    public string Id              { get; set; }
    public string Name            { get; set; }

    public void CloneFrom(PersonDTO dto)
    {
        Id   = dto.Id;
        Name = dto.Name;
    }

    public PersonDTO GetDTO()
    {
        return new PersonDTO()
        {
            Id   = Id;
            Name = Name;
        }
    }
}

我喜欢 A 中的关注点分离(业务对象不了解 DTO),但我更喜欢 B 的封装(无需将业务对象的内脏暴露给 DTO)。

只是想知道是否有标准方法?

4

3 回答 3

11

我认为这需要一个单独的班级,因为 BO 和 DTO 都不应该关心他们转变为另一个班级。

我个人使用 automapper 库进行对象转换。通过像您的示例中这样的简单转换,映射是在一行代码中完成的,复杂的转换也很容易设置。

如果您想自己映射,您仍然可以使用扩展方法将映射实现与您的 DTO 和 BO 类分开。

于 2012-04-24T14:02:08.233 回答
1

我会建议一个组件层。它应该负责您的业务层和数据层之间的通信。在这种情况下,您可以使用它将 DTO 对象转换为业务对象。

于 2012-04-24T14:03:17.333 回答
0

您担心“无需向 DTO 公开业务对象的胆量”似乎有点没有根据,除非您在访问公共属性时没有在代码中显示某些内容,即根本没有胆量。

顺便说一句,您可以实现一个强制转换运算符,而不是克隆方法:MSDN

这样,您可以执行以下操作: Person p = (Person)myPersonDTO;

于 2012-04-24T14:06:47.190 回答