2011-03-25 60 views
3

伙计们,最佳实践/模式来填充“视图模型”对象

我试图找出一个模式或最佳实践的数据来自于“视图模型”对象的域对象/数据源转换。在我的例子中,域对象是WCF代理对象。任何对WCF方法的调用都会填充这些代理对象,这些对象最终会被传送到'ViewModel'对象。请参阅Architectural diagram

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

dorman

+0

我添加了一个类图,以便我们可以向下钻取。 [Class Diagram](http://flic.kr/p/9tpBQN)您是否同意B的评论:(见图) – dormantroot 2011-03-26 11:39:29

回答

1

是的,你需要有一个存储库。 这会给你一些优点,比如视图模型的简单测试;以后也可以轻松切换到另一种存储库。

根据您提供的文章,它给了他们单元测试视图模型逻辑的优势;之后,他们可以从XML文件存储库切换到SQL服务器存储库(作为示例)。

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

+0

Tengiz ...我认为存储库模式只适用于数据源端。就我而言,它将是检索和插入数据的WCF层。你怎么看?见类图....我们可以在任何地方应用Repository模式吗?请告诉我。谢谢。 – dormantroot 2011-03-26 11:47:23

+0

dormantroot:您不应该操作由域(业务)层中的wcf返回的数据。相反,将wcf层看作数据访问层,数据来自这个层。因此,在最低限度内,您应该构建一个包含wcf返回对象的域数据对象(实际上,最好在检索后将wcf对象转换为域对象)。因此,您应该使用您的域对象而不是wcf。说得通? – Tengiz 2011-03-26 12:56:10

+0

Tengiz:是的,你是对的!我不会直接使用WCF对象。我会定义创建一个域对象层。我的图是基于书中的一个例子。所以它将是WCF Objects ----> Domain Objects -----> ViewModel ---> View。那么,我们可以使用什么样的模式,以便WCF对象和域对象松散耦合? – dormantroot 2011-03-26 21:20:46

2

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

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

编辑:

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

+0

感谢您的回复。请参见附加的类图(注释A:).....适配器模式是否仍然适用? – dormantroot 2011-03-26 11:44:02

+0

谢谢Jakub ...是的,你是对的!我不会使用WCF代理对象。我指的是我在书中找到的一个例子。所以,回到你的评论,如果我的理解正确,我会做这样的事情:WCF <---->> AutoMapper <<----->域/模型对象------> ViewModel ----->查看,更正?如果是这样,我们仍然遇到通过AutoMapper将WCF对象与Domain/Model对象耦合的问题。你怎么看? – dormantroot 2011-03-26 21:12:31

+0

另外,关于评论B的建议是什么(在类图中)? – dormantroot 2011-03-26 21:21:55

0

保持简单,每班有一个责任。

这表明您的代理(通信对象)返回的对象与ViewModel(视图对象)使用的对象之间有一些分隔。这样客户端逻辑就与通信/传输方法分离了。

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

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