我得到了一些返回 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 有效。
那么我错了吗?从什么时候开始创建一个新的 DTO,什么是一个好的阈值(nbr of changes)?
更新: 如果我在 WCF 中公开一个会公开 ProductDTO 的服务,如果它们未设置或为空,它是否必须传输KnownDefects和InStockSince属性?还是 WCF 足够聪明,根本不需要传输未定义/空属性?(在这种情况下,我不介意只有一个具有 2 个不总是使用的属性的 DTO。)
另一个更新: 如果我从 ProductDTO 继承 ProductAdminDTO,我仍然可以用它调用以下服务(只接受 ProductDTO)吗?
bool SaveProduct(ProductDTO)
好吧,我想我可以自己尝试一下,稍后会更新:)