对象映射器与对象包装器

时间:2017-02-14 14:19:12

标签: oop automapper data-access-layer objectmapper

我很感激这里有点帮助...

让我们说在应用程序中我们有一个数据层和一个业务逻辑层。在DAL中,我们有以下实体:

public class Customer {
    public string Name {get; set;}
    public ICollection<Address> Addresses {get; set;}
}

public class Address {
    public string Street {get; set;}
}

在BLL中我们有以下POCO:

public class CustomerDto {
    public string Name {get; set;}
    public ICollection<AddressDto> Addresses {get; set;}
}

public class AddressDto {
    public string Street {get; set;}
}

DAL中的实体使用ligth-weight ORM填充,并使用存储库从BLL检索。例如:

public class CustomerInformationService {

    private readonly ICustomerRepository _repository {get; set;}
    public CustomerInformationService (ICustomerRepository repository)
    {
         _repository = repository;
    }
    public class CustomerDto Get(int id)
    {
         var customerEntity = _repository.Get(id);

         var customerDto = /* SOME TRANSFORMATION HERE */

         return customerDTO;
    }
}

我的问题是关于这里的/ *转换* /部分。我们的团队正在讨论如何进行&#34;映射&#34;。

一种方法是使用映射器或者自动映射或手动映射。 第二种方法是使用类似于Entity的包装器并引用DTO以便在对象之间保存复制操作。像这样:

public class CustomerDto
{
     private IEntity _customerEntity;

     public IEntity CustomerEntity { get {return _customerEntity;}}

     public CustomerDto(IEntity customerEntity)
     {
          _customerEntity = customerEntity;
     }

     public string Name 
     { 
          get { return _customerEntity.Name; }
     }
     public ICollection<Address> Addresses 
     { 
          get { return _customerEntity.Addresses; }
     }
}

第二种方法对我来说有点奇怪,因为_customerEntity.Addresses感觉就像我的DAL和我的BLL之间的泄漏(_customerEntity&#39; s reference)但我不确定。

使用一种方法优于另一种方法是否有任何优势/劣势?

其他信息:我们通常拉最大值。一次需要在实体和DTO之间进行转换的1000条记录。

2 个答案:

答案 0 :(得分:0)

我打赌服务层方法。基本上是因为看起来像业务对象或域对象的东西与 DTO 无关。

事实上,您和您的团队应该使用 AutoMapper ,而不是重复相同的代码,这将包括设置A到B,A到C,C到B的一些属性。 ..

答案 1 :(得分:0)

你没有提到你的&#34;轻量级ORM&#34;。我将分两部分回答。

如果您正在使用创建代理的ORM

您应避免将实体暴露在特定边界之外。像NHibernate / EF这样的ORM基于代理实现延迟加载。如果将实体暴露给应用程序/ UI层,则无法控制ORM行为。这可能会导致许多意想不到的问题,调试也很困难。

在DTO中包装实体将一事无成。无论如何,您正在访问实体。

使用DTO并使用某些映射器工具(如AutoMapper)映射它们是一个很好的解决方案。

如果您使用的是不创建代理的ORM

请勿使用DTO,直接使用您的实体。在许多情况下,DTO在这里很有用并且推荐使用。但是您提供的示例根本不需要DTO。

如果您选择使用DTO,在DTO中包装实体是没有意义的。如果你想要使用实体,为什么要包装它?同样,像AutoMapper这样的工具可以提供帮助。

参考this问题。情况有所不同;我问是/否,您要求如何。但它仍然可以帮助你。