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

What should have the responsibility to create dynamic views?

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

例如,假设按下了一个按钮,现在必须第一次打开一个新的图形用户界面,我应该在哪里放置工厂调用来创建新视图?

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

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

如果你的问题针对的是Model,View还是ViewM模型的答案是:都不是。

MVVM 是一种设计模式,它规定了视图与代码的分离方式(尤其是视图和表示逻辑)。

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

n层通常由

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

这使得如何分离您的职责以及如何保持您的应用程序的可移植性变得更加清晰。

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

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

然而,应用层 非常 特定于您制作的应用程序并且不可重复使用。当你有一个桌面应用程序要移植到 Windows Phone 时,你必须从头开始创建应用程序层(即选择与 WinPhone 兼容的 DI 框架,导航非常不同和特定视图,XAML/UI 功能也不同等等)。

它们中的每一个通常都在它自己的程序集中,以便更容易地执行此模型。例如,在您的 Presentation 程序集(您的 ViewModel 所在的位置)中,您没有对 Application Layer 程序集的引用。现在,当您尝试使用应用程序程序集中的类型时,您会意识到您无法访问它的 namespace/type 并且这告诉您:"Uh-oh. You were about to violate the MVVM/n-tier model" 并且无论您尝试什么,都是错误的。

最后回答你最初的问题

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

然后 NavigationService 会(根据导航请求)调用您的 IViewFactory(它也可以在应用程序层中实现,或者如果它打算与基础架构中的其他平台重用层),它会动态构建您的视图。

从您的 ViewModel 中,您只需执行类似 navigationService.Navigate<CustomerViewModel>(customerId) 的操作。剩下的就看application/infrastructure层的具体实现了。

希望对您有所帮助。