【发布时间】: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 的服务,如果它们未设置或为空,它是否必须传输 KnownDefects 和 InStockSince 属性? 还是 WCF 足够聪明,根本不需要传输未定义/空属性? (在那种情况下,我不介意只有一个 DTO 和 2 个并不总是使用的属性。)
另一个更新: 那么如果我从 ProductDTO 继承 ProductAdminDTO,我还能用它调用以下服务吗(只接受 ProductDTO)?
bool SaveProduct(ProductDTO)
好吧,我想我可以自己尝试一下,稍后会更新:)
【问题讨论】:
-
有很多解决方案。继承、组合、Tuple
任何你认为最适合你的东西。做吧 -
所以如果继承没问题,我就直接继承DTO,然后调用DoSomethingWithTheDTO方法就不用担心了。会很快更新我的问题。
-
我刚刚从一个好人那里得到了那个信息:“从 wcf 的角度来看,你的数据契约是消息结构定义,而不是内存中的对象,我认为这可能是不可能的。”这就是我担心的!
-
好吧,我注意到我只在不检查 WCF 时才使用“扩展”DTO,因此我没有用 [DataMember] 属性标记它。所以我不应该真的在乎。 :)