我正在设置一个由多个WCF服务组成的应用程序,其中只有一个可以访问数据库。我们将在DTO中传递大量数据,有时是批量传递。因为批量操作假设一个参数保持不变,所以我喜欢以下模式:
private void UpdateItems(long clientId, ItemDto[] items);
根据Martin Fowler,DTO被定义为“可以保存呼叫所有数据的对象”。这是否意味着我不应该在DTO之外传递其他数据?我真的应该看下面的模式吗?似乎打败了我的参数点。
private void UpdateItems(ItemsDto itemsDto);
ItemsDto {
long ClientId;
ItemDto[] Items;
}
答案 0 :(得分:3)
我认为Martin Fowler很棒,但绝对不想做任何事情“因为Fowler说”。真正需要的是思考他为什么提出这个建议,看看这些理由是否适合你。
在这里创建多项目DTO的效果是,如果您需要更改批处理操作的参数,则无需更改界面。
例如,如果您必须在参数中添加clientTimeStamp
,则它看起来像这样:
private void UpdateItems(long clientId, DateTimeOffset clientTimeStamp, ItemDto[] items);
或者这个:
private void UpdateItems(ItemsDto itemsDto);
ItemsDto {
long ClientId;
DateTimeOffset clientTimeStamp;
ItemDto[] Items;
}
另外,请注意,您仍然可以通过创建将参数打包到DTO中的扩展方法,以日常方式使用旧界面。
那么有什么好处?不同之处在于,如果您的方法是公共的并且被许多客户端使用,则可以通过第二种方式保持向后兼容性。更改代码也更容易,但使用VS和resharper,实际上并没有太大的区别。成本是需要编写的一些额外代码(在示例中相当小,但在实际代码库中可能更大)。
如果您希望客户端代码超出您的直接控制范围(包括您编写的客户端,但由于某种原因可能无法更新),那么这里的DTO可能是值得的。否则,我会不管它,直到下次我想在那里添加一个参数。