我应该创建多少个DTO?

时间:2012-10-25 04:26:14

标签: wcf c#-4.0 dto

我得到了一些我返回DTO的服务, 现在我可以为不同的方法重复使用相同的DTO。

假设我有以下界面:

List<ProductDTO> GetProductsByReseller(int reseller)
List<ProductDTO> GetProductsByManufacturer(int Manufacturer)
List<ProductDTO> GetProductsByCategory(int Category)

对他们使用相同的DTO绝对有效,我认为,因为它们都有相同的字段。

public class ProductDTO
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public int Reseller { get; set; }
    public int Manufacturer { get; set; }
    public int Category { get; set; }
}

现在我有其他一些方法,例如:

List<ProductDTO> GetProductsWithAdminInfoByCategory(int Category)

对于这种方法,我必须用一些额外的字段扩展DTO。

     #region only for admin
     public int KnownDefects { get; set; }
     public DateTime InStockSince { get; set; }   
     #endregion //only for admin

是否可以重复使用现有的DTO并简单地扩展它? 或者我应该创建一个新的DTO,因为某些字段永远不会从该方法中使用?

我的想法:如果只有1或2个字段是新的(在其他情况下从未使用过),也许没关系,因为我不必创建重复的DTO,维护2个DTO而不是1的交易是可以的。如果我从ProductDTO派生AdminProductDTO可能会很好,但我不知道继承是否对DTO有效。

我错了吗? 什么是良好的阈值(变化的nbr),从何时开始创建一个新的DTO?

更新 如果我在WCF中公开一个会暴露ProductDTO的服务,那么它是否必须传输 KnownDefects InStockSince 属性(如果它们未设置或为null)? 或者WCF足够聪明,根本不需要传输undefined / null属性? (在这种情况下,我不介意只有一个DTO具有2个并不总是使用的属性。)

另一个更新: 好吧,如果我从ProductDTO继承ProductAdminDTO,我是否仍然可以使用它调用以下服务(只接受ProductDTO)?

bool SaveProduct(ProductDTO)

嗯,我想我可以自己尝试一下,稍后会更新:)

1 个答案:

答案 0 :(得分:2)

好吧,你似乎陷入了经典继承Vs Composition问题。

想想ProductionWithAdminInfo是否是“ISA”产品? 我不认为它满足ISA关系。额外的管理信息只是产品的另一个属性。

所以这里的构图似乎是不错的选择。 ProductWithAdminInfoDTO包含ProductDTO和AdminInfoDTo。