在多个视图模型之间共享模型对象的最佳做法是什么?

时间:2014-01-26 16:57:41

标签: wpf mvvm repository-pattern

在我的WPF应用程序中,我正在使用MVVM模式和存储库模式。我有一个存储库,提供了一个飞机对象列表。从用户的角度来看,我想以几种不同的方式显示这些飞机(例如,在地图上,在列表中,以文本形式等),并且还允许用户过滤对象。为了实现这一点,我为每种表示数据的不同方式构建了视图和视图模型。

我现在的问题是,我不确定最佳做法是使所有不同视图模型的飞机对象列表可用。以下是我考虑过的一些替代方案:

1.将存储库注入每个视图模型,然后从存储库获取所有对象。

2.将存储库注入一个MainViewModel,它从repo中检索所有对象,然后将对象集合注入到需要它的所有其他视图模型中。

总而言之:我有一组视图模型,它们都使用相同的模型对象集合。在使用存储库模式时,在视图模型之间共享此集合的最佳实践是什么?

4 个答案:

答案 0 :(得分:2)

在WPF应用程序中,我通常会创建服务对象,这些服务对象封装存储库,而每个存储库又包含一个会话对象,但我使用依赖注入来注入实际的实现。这样做的一个主要好处是可以轻松地模拟单元测试的所有内容,但另一个好处是您现在可以完全控制这些对象的范围。如果您从数据库中提取数据,那么您将拥有不同的会话管理策略,具体取决于您是开发Windows应用程序还是网站(例如),而在企业应用程序中,即使在相同的代码中,此要求也会发生变化基础。有一篇关于Germán Schuager's blog的好文章讨论了各种会话管理策略的优缺点,但对于每个表单使用一个会话的WPF应用程序似乎是一个很好的文章。如果您正在使用Ninject之类的东西,那么您只需将ISession对象的范围扩展到顶层“页面”的视图模型,然后该页面的逻辑层次结构中的所有对象都可以创建自己的存储库,而无需了解每个其他。由于它们都共享相同的会话对象,因此它们也在存储库缓存中共享相同的实体,因此模型现在由多个视图模型共享。剩下的唯一事情是向域层中的实体类添加属性通知,以便一个视图模型所做的更改传播到其他视图,但这是另一个帖子的主题(提示:您的数据库层应该提供一些机制)注入自己的包装器代理以使用Castle DynamicProxy等自动添加属性更改通知。

答案 1 :(得分:0)

一般的经验法则是EACH视图应该拥有自己的ViewModel,您可以通过继承或添加属性重用ViewModels,但是再次视图“DESERVES”它自己的ViewModel。

您可以让您的视图利用接口,您的视图模型可以实现接口。

答案 2 :(得分:0)

我们有一个复杂的复合金融应用程序,我们需要跨视图模型共享各种模型对象。所以我们采用了一种方法:我们创建了一个高级模型对象,它包含其他模型实体的集合。在服务层中返回/填充此高级模型。我们在许多视图模型中共享此高级模型对象,并使用事件聚合器与许多PRISM模块共享。

因此,在您的情况下,您可能拥有AircarftsData模型,可以维护飞机的收集。您可以使用存储库填充此模型。然后你可以在各种视图模型中传递这个AircarftsData。

我们已将此应用程序投入生产中,并且没有遇到任何问题。有一点你可能要小心这个Model对象的内存泄漏。如果该模型的任何子对象以某种方式泄露在内存中,那么整个高级模型可能会保留在内存中。

答案 3 :(得分:0)

您的数据应位于某个地方......(服务,数据库,文件等)。 在这种情况下,您应该有一个管理您的客户端请求的类: GetAllAircrafts,Create,Update,Etc ...... 这个类叫做XXXService。 我认为这是你应该公开你的模型集合的地方。 可以将此服务注入视图模型并通过get属性共享模型集合(也许作为只读集合......?)

祝你好运!