【问题标题】:How many DTOs should I create?我应该创建多少个 DTO?
【发布时间】:2012-10-15 05:18:18
【问题描述】:

我得到了一些返回 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 足够聪明,根本不需要传输未定义/空属性? (在那种情况下,我不介意只有一个 DTO 和 2 个并不总是使用的属性。)

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

bool SaveProduct(ProductDTO)

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

【问题讨论】:

  • 有很多解决方案。继承、组合、Tuple 任何你认为最适合你的东西。做吧
  • 所以如果继承没问题,我就直接继承DTO,然后调用DoSomethingWithTheDTO方法就不用担心了。会很快更新我的问题。
  • 我刚刚从一个好人那里得到了那个信息:“从 wcf 的角度来看,你的数据契约是消息结构定义,而不是内存中的对象,我认为这可能是不可能的。”这就是我担心的!
  • 好吧,我注意到我只在不检查 WCF 时才使用“扩展”DTO,因此我没有用 [DataMember] 属性标记它。所以我不应该真的在乎。 :)

标签: wcf c#-4.0 dto


【解决方案1】:

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

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

因此,组合在这里似乎是不错的选择。 ProductWithAdminInfoDTO 包含 ProductDTO 和 AdminInfoDTo。

【讨论】:

  • 所以你认为继承 DTO 是有效的,对吧?好吧,我将迅速更新我的问题,以使我的一个难题更加明显。我看到你的答案没有朝着我想要的方向发展。 :)
  • 如果有你想要的方向,就去做。用你的直觉:)
  • 即使我仍然不确定,也可以将您的答案标记为答案,我可以将 InheritedDTO 传递给具有 ParentDTO 服务合同的服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多