1

我得到了一些返回 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 的服务,如果它们未设置或为空,它是否必须传输KnownDefectsInStockSince属性?还是 WCF 足够聪明,根本不需要传输未定义/空属性?(在这种情况下,我不介意只有一个具有 2 个不总是使用的属性的 DTO。)

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

bool SaveProduct(ProductDTO)

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

4

1 回答 1

2

好吧,您似乎陷入了经典的继承与组合问题。

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

所以在这里作曲似乎是不错的选择。ProductWithAdminInfoDTO 包含 ProductDTO 和 AdminInfoDTo。

于 2012-10-25T04:33:07.507 回答