使用DTO是否意味着我在方法调用中没有其他参数?

时间:2013-01-21 09:42:45

标签: web-services design-patterns dto

我正在设置一个由多个WCF服务组成的应用程序,其中只有一个可以访问数据库。我们将在DTO中传递大量数据,有时是批量传递。因为批量操作假设一个参数保持不变,所以我喜欢以下模式:

private void UpdateItems(long clientId, ItemDto[] items);

根据Martin Fowler,DTO被定义为“可以保存呼叫所有数据的对象”。这是否意味着我不应该在DTO之外传递其他数据?我真的应该看下面的模式吗?似乎打败了我的参数点。

private void UpdateItems(ItemsDto itemsDto);

ItemsDto {
    long ClientId;
    ItemDto[] Items;
}

1 个答案:

答案 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可能是值得的。否则,我会不管它,直到下次我想在那里添加一个参数。