我得到了一些我返回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)
嗯,我想我可以自己尝试一下,稍后会更新:)
答案 0 :(得分:2)
好吧,你似乎陷入了经典继承Vs Composition问题。
想想ProductionWithAdminInfo是否是“ISA”产品? 我不认为它满足ISA关系。额外的管理信息只是产品的另一个属性。
所以这里的构图似乎是不错的选择。 ProductWithAdminInfoDTO包含ProductDTO和AdminInfoDTo。