如何为不同的前端建模数据传输对象?

时间:2009-12-15 13:34:50

标签: data-modeling

我遇到了重新解决问题,我没有找到任何好的例子或模式。

我有一个核心服务,可以执行所有繁重的数据库操作,并将结果发送到不同的前端(html,silverlight / flash,Web服务等)。 其中一个服务操作是“GetDocuments”,它提供基于不同过滤标准的文档列表。如果我只有一个前端,我想将结果打包到仅包含数据的Document DTO(数据传输对象)列表中。但是,不同的前端需要不同数量的“元数据”。简单客户端只需要文档标题和链接引用。其他客户想要文档的简短文本片段,另一个想要缩略图,第三个想要作者的名字。它基本上都取决于GUI的实现需要显示什么。

这是建模的最好方法:

  1. 作为很多不同的DTO(Document,DocumentWithThumbnail,DocumentWithTextSnippet)
    • 往往会成为很多课程
  2. 作为一个包含所有数据的DTO,客户端选择要显示的内容
    • 发送了大量不必要的数据
  3. 作为一个DTO,根据客户端请求填充某些字段
    • 趋向于成为一个需要延长的非常大的课程
  4. 一个DTO,但包含某种包含所请求元数据的通用“元数据”字段。
  5. 还是有其他选择吗?

    由于我需要高性能服务,因此我需要考虑网络负载和缓存策略。

    有没有人有任何可能对我有帮助的好模式或做法?

2 个答案:

答案 0 :(得分:0)

创建具有您的任何视图可能需要的所有数据并在任何地方使用它的DTO是否有任何显着的成本?我会这样做,特别是因为它使您免受需求变更的影响,让其中一个视图合并数据,其中一个视图使用

离。也许你的silverlight / flash视图没有显示标题本身b / c现在是拇指,但是他们决定以后再按它排序。

为了澄清,我并不认为你每次都需要传递所有数据,但我认为你的DTO类应该定义所有数据。只是不要陷入过早优化或分析瘫痪的陷阱。先做最简单的事,然后证明增加了复杂性。把它全部扔进去并描绘它。如果性能不可接受,请进行优化并重试。

答案 1 :(得分:0)

我要做的是让前端能够请求存在所需的元数据(比如getDocument(WITH_THUMBNAILS | WITH_TEXT_SNIPPET))

然后,此DTO仅使用此请求的信息构建。 正如您所说,添加所有可能的元数据是不可接受的。

我肯定会留下一个定义所有可能方法的类(getTitle(),getThumbnail()),如果可能的话,它会在未请求缩略图时返回占位符。像“图像不可用”之类的东西。

如果您想像模式一样对此进行建模,请查看工厂模式。

希望这会对你有所帮助。