我很感激这里有点帮助...
让我们说在应用程序中我们有一个数据层和一个业务逻辑层。在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条记录。
答案 0 :(得分:0)
我打赌服务层方法。基本上是因为看起来像业务对象或域对象的东西与 DTO 无关。
事实上,您和您的团队应该使用 AutoMapper ,而不是重复相同的代码,这将包括设置A到B,A到C,C到B的一些属性。 ..
答案 1 :(得分:0)
你没有提到你的&#34;轻量级ORM&#34;。我将分两部分回答。
您应避免将实体暴露在特定边界之外。像NHibernate / EF这样的ORM基于代理实现延迟加载。如果将实体暴露给应用程序/ UI层,则无法控制ORM行为。这可能会导致许多意想不到的问题,调试也很困难。
在DTO中包装实体将一事无成。无论如何,您正在访问实体。
使用DTO并使用某些映射器工具(如AutoMapper)映射它们是一个很好的解决方案。
请勿使用DTO,直接使用您的实体。在许多情况下,DTO在这里很有用并且推荐使用。但是您提供的示例根本不需要DTO。
如果您选择使用DTO,在DTO中包装实体是没有意义的。如果你想要使用实体,为什么要包装它?同样,像AutoMapper这样的工具可以提供帮助。
参考this问题。情况有所不同;我问是/否,您要求如何。但它仍然可以帮助你。