使用WVM服务作为使用MVVM设计模式的WPF应用程序中的模型

时间:2011-07-26 15:43:01

标签: .net sql wpf wcf mvvm

使用MVVM编写WPF应用程序时,我想使用WCF服务,并在其上使用方法提供应用程序数据库中的相关数据。

例如,如果我的系统有一个任务列表,它们将存储在SQL数据库中。我可以在Web服务上放置一个方法来从数据库中检索所有任务。

我可以从ViewModel调用此方法并将结果存储在

public List<Task> Tasks { get; set; }

然后我将View的控件绑定到此属性。

当Tasks属性发生变化时,我已经有一些东西可供我的View更新(我没有把它放在上面以保持示例简单)。

我的问题是,当其他人将新任务添加到数据库时,如何更新ViewModel上的Tasks属性?

我是否需要每隔x分钟轮询数据库以查找新任务(通过WCF服务上的方法)?

或者我可以以某种方式执行某些操作,以便在将任务添加到数据库时更新Tasks属性吗?

3 个答案:

答案 0 :(得分:4)

您可以使用Publish Subscribe Framework for WCF Services实现此目的。这允许您的WPF应用程序从WCF服务器订阅更新。然后,当新数据可用时,服务器将调用WPF应用程序提供的WCF服务。然后,您可以使用新数据更新视图模型。如果您的WCF服务还控制数据库的存储,那么您可以简单地捕获更改,并向您订阅的WPF客户端发送通知。

答案 1 :(得分:1)

您需要执行某种轮询才能使其正常工作。对ViewModel中的数据所做的更改会直接更新(通过绑定),因为所有更改都发生在WPF应用程序的内存中。但是,只有数据库才能知道对数据库的更改。

您可能希望向WCF服务添加一个方法,该方法将使用DateTime,该方法将返回自给定时间以来添加的所有任务。然后,以对您的使用方案和预期数据更新率有意义的频率从ViewModel调用该方法。此时,添加的任何新闻任务都应反映在您的视图中。

答案 2 :(得分:0)

您可以使用CQRS approach,具体取决于应用。如果应用程序是简单的CRUD,那么它可能不值得,但如果您正在构建更复杂的域模型或寻找显着的可伸缩性,这可能值得研究。 CQRS基本上将您的命令与查询分开。在您的方案中,您可能将实际的ViewModel存储在数据库中,客户端可以直接从那里获取它们,而无需通过WCF。您还可以让您的客户订阅域事件,以使其能够根据需要动态刷新。