DTO负责表示层和应用层之间的数据传递,需要定义在应用层,建议定义在Application.Contracts项目中,这样可以将应用的具体实现和定义分开。
DTO在应用层项目的ApplicationAutoMapperProfile中定义与领域实体之间的映射关系,需要注意的是,如果DTO中包含领域实体中不一致的属性,需要忽略,比如:
public class ProductStoreApplicationAutoMapperProfile : Profile
{
public ProductStoreApplicationAutoMapperProfile()
{
CreateMap<Category, CategoryDto>();
CreateMap<Product, ProductWithDetailsDto>().Ignore(p=>p.Categories);
}
}
DTO必须能够序列化,因为在传输时需要转换为JSON。如果DTO带有参数的构造函数,那么推荐定义一个无参数的公开构造函数。
对于输入DTO,应该为每个用例创建一个类型的DTO,比如针对创建需要有CreateCategoryDto,对于更新,需要有UpdateCategoryDto。即使两个用例的输入完全相同,仍然建议创建不同类型的DTO,避免混淆。
对于输出DTO,如果可以确保所有的属性都能够返回,可以在不同用例中使用相同的DTO。这一点非常重要,特别是对于聚合根来说,可能包含关联实体的集合,如果某些用例下,没有填充这些关联的集合(比如返回列表),那么编写客户端的开发人员在访问这些集合时就无法获取正确的数据。这种情况下,就需要定义不同的DTO,比如ProductWithDetailsDto用于返回详细信息,ProductDto用户返回基本信息。
网友评论