什么应该有责任创建动态视图?

时间:2015-07-03 15:52:37

标签: mvvm mvp

使用MVVM或MVP模式并不重要,哪个实体应该负责创建动态视图作为对事件的响应?

例如,让我们说按下一个按钮,现在必须首次打开一个新的gui,我应该在哪里放置工厂调用来创建新视图?

从与视图本身无关的演示者创建视图对我来说看起来很难看。调解按钮视图并在调解器内使用工厂?在命令中使用工厂?

注意:我的意思是删除MVVM部分,但后来我收到了第一个答案,我认为这是正确的,因为我喜欢一般的想法(也可以应用于MVP)。但是,如果您有其他干净的方法来解决问题,我将很高兴听到您的意见。

1 个答案:

答案 0 :(得分:0)

如果您的问题针对的是 M odel, V iew还是 V iew M odel anser是:不是。

MVVM是一种设计模式,它规定了视图如何与代码分离(特别是视图和表示逻辑)。

但是,它没有规定如何或在何处实施业务和应用程序逻辑。 MVVM通常与其他设计模式一起使用,如n层或DDD(域驱动设计)。

n层通常由

组成
  • 应用程序层是您的应用程序服务的位置,例如依赖注入,导航服务,ViewModel定位器,查看工厂。这也是视图位于n层模型中的位置
  • 表示层是您的表示逻辑(特别是您的ViewModels)
  • 业务/域层是您的业务逻辑所在的位置(模型,域服务,如购物应用程序中的OrderService
  • 基础架构层是您的基础架构所在的位置,特别是数据库(存储库,CQRS)或Web服务的抽象,依赖于某种技术的东西,如SignalR,ASP.NET Identity,OWIN等等,仅举几例

这使您更清楚地了解如何分离您的职责以及如何保持您的应用程序的可移植性。

例如,您将拥有一个实现表示层,业务层(您的应用程序核心)和一些基础架构(即Web服务通信)的应用程序。例如,当您将应用程序从桌面应用程序移植到Windows Phone应用程序时,可以轻松地重复使用这些部件。

您将能够重用整个域层和表示层(ViewModel)以及大多数基础架构(即您可能必须将MSSQL切换为SQLite或SQLCompact的数据访问层)。

但是,应用程序层非常特定于您创建的应用程序,而不是可重用的。当你想要移植到Windows Phone的桌面应用程序时,你必须从头开始创建应用程序层(即选择与WinPhone兼容的DI框架,导航是非常不同的,特定于View,XAML / UI功能也不同等)。

它们中的每一个通常都在其自己的程序集中,以便更容易实施此模型。例如,在Presentation程序集(ViewModel所在的位置)中,您没有对Application Layer程序集的引用。现在,当您尝试使用应用程序集中的类型时,您将意识到您无法访问它的命名空间/类型,这告诉您:"呃 - 哦。您即将违反MVVM / n层模型"无论你怎么做,都是错的。

最后到您的初始问题

理想情况下,您的表示层(ViewModel)程序集中将有一个INavigationService接口。但是您将在应用层中实现此服务,因为NavigationService需要知道视图才能工作,但ViewModel不允许这样的知识。

NavigationService然后(在导航请求中),调用您的IViewFactory(也可以在应用层中实现,或者如果它可以在其他平台中重复使用)基础设施层)它将动态构建您的视图。

您可以在ViewModel中执行navigationService.Navigate<CustomerViewModel>(customerId)之类的操作。其余部分取决于应用程序/基础架构层中的具体实现。

希望它有所帮助。