【问题标题】:Best Practice/Pattern to Populate 'ViewModel' objects填充“ViewModel”对象的最佳实践/模式
【发布时间】:2011-07-22 22:07:53
【问题描述】:

伙计们,

我正在尝试找出一种模式或最佳实践,将数据从域对象/数据源转换为“ViewModel”对象。在我的特定示例中,域对象是 WCF 代理对象。对 WCF 方法的任何调用都会填充这些代理对象,这些代理对象最终会转移到“ViewModel”对象。见Architectural diagram

这篇微软文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx 讨论了使用存储库模式。它在“数据模型和存储库”部分中提到。这是最好的方法吗?有人可以给我建议吗?

多尔曼

【问题讨论】:

  • 我正在添加一个类图,以便我们可以向下钻取。 Class Diagram你们都同意评论B吗:(见图)

标签: .net design-patterns mvvm


【解决方案1】:

存储库模式与数据访问层(WCF 内部的内容)有关。这与表示层无关。

我建议您根据 UI 的要求在 MVC 项目中声明您的 Model 和 ViewModel 类(不考虑您的数据库架构)。然后,您可以使用AutoMapper 来简化将值从 WCF 代理类复制到模型所需的代码。您可能希望将此代码封装在 Adapter 类中,以保护应用程序的其余部分免受 AutoMapper 代码的影响。

编辑:

不要将您的 WCF 代理用作模型类。根据您的 UI 声明单独的模型类并使用 AutoMapper 在它们之间复制数据。

【讨论】:

  • 感谢您的回复。请参阅附加的类图(注释 A:).....适配器模式是否仍然适用?
  • 谢谢 Jakub... 是的,你是对的!我不会使用 WCF 代理对象。我指的是我在书中找到的一个例子。所以,回到你的评论,如果我理解正确的话,我会做这样的事情:WCF>AutoMapperDomain/Model Objects------> ViewModel -----> View ,对吗?如果是这样,我们仍然会遇到通过 AutoMapper 将 WCF 对象与 Domain/Model 对象耦合的问题。你怎么看?
  • 另外,你对评论 B 有什么建议:(在类图中)?
  • AutoMapper 没有耦合,它充当适配器以消除耦合。是的,使用 DI。
【解决方案2】:

是的,您需要有一个存储库。 这会给您带来一些优势,例如轻松测试视图模型;以后也可以轻松切换到另一种存储库。

就您提供的文章而言,- 它为他们提供了对视图模型逻辑进行单元测试的优势;并且,稍后,他们可以从 XML 文件存储库切换到 SQL 服务器存储库(作为示例)。

只需确保将抽象存储库注入 ViewModel。

【讨论】:

  • Tengiz...我认为存储库模式仅适用于数据源端。就我而言,它将是检索和插入数据的 WCF 层。你怎么看?见类图......我们可以在任何地方应用存储库模式吗?请告诉我。谢谢。
  • dormantroot:您不应该在您的域(业务)层操作 wcf 返回的数据。相反 - 将 wcf 层视为数据访问层,数据来自该层。因此,您至少应该构建一个包装 wcf 返回对象的域数据对象(实际上,最好在检索后将 wcf 对象转换为域对象)。因此,您应该使用域对象而不是 wcf 对象。有意义吗?
  • Tengiz:是的,你是对的!我不会直接使用 WCF 对象。我肯定会创建一层域对象。我的类图是基于书中的一个例子。所以它会是 WCF 对象---->域对象----->ViewModel--->View。那么,我们可以使用什么模式让 WCF 对象和域对象松散耦合?
  • dormantroot:这正是您需要的存储库模式 - 正如文章中所述。存储库应该操作域对象,例如查找、保存等。ViewModel 需要在其中注入一个抽象存储库,并在需要时调用它。而且,在您的应用程序中构建 ViewModel 时,您应该传递一个抽象存储库的实现。在您的情况下,这将是使用 wcf 服务作为数据存储的实现。清除吗?
【解决方案3】:

保持简单,每个类都有一个职责。

这表明代理返回的对象(通信对象)和 ViewModel 使用的对象(视图对象)之间存在一定的分离。通过这种方式,客户端逻辑与通信/传输方法分离。

如果您有与 UI 元素密切相关的 WCF 服务,那么只需将 CO 转换为 VO。由于视图绑定到 VO,因此视图会更新。

如果您需要在客户端插入业务或域逻辑,请转换为中间域对象。然后让对象与其他域模型对象(您提到的文章中的所谓存储库)进行交互。 VO 应该听取域的变化并做出相应的反应。这种模式表明域对象不依赖于 WCF 或 WPF。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多