c# - MVVM DDD 应用程序中的组合根

标签 c# .net wpf mvvm

所以,答案应该很简单:正如 Mark Seemann 所写 here :

组合根是应用程序中模块组合在一起的(最好)唯一位置。 ( ... ) 在 WPF 应用程序中,它是 Application.OnStartup 方法

虽然我不确定 OnStartup 方法。假设我们有一个由这些具有依赖项的项目组成的应用程序:

Domain <- App Services <- WPF Client(ViewModels PCL <- 带 View 的可执行 WPF 客户端)

MVVM 模式表明业务逻辑应该在 ViewModel 中进行。 (编辑:啊,我用错词了:/我的意思是:当你在类 Game 中有业务逻辑(在域中),并且它有方法 Move,如果移动完成游戏则返回 true - 你您的 View 中不需要游戏。您需要一个命令 - MoveCommand 和 ViewModel 中的游戏。 View 应该只知道该命令)。 View 应该只知道必须从哪个 ViewModel 执行什么命令。所以基本上,View 应该只知道 ViewModel。有关 Domain 的知识在 View 中毫无用处。

所以我的问题是:我应该采用哪种 MVVM 方法?

  • 我想保持最佳实践并在合成根中创建每个对象
  • 我想在 View 模型中显示我的业务对象,而不是在 View 中

ViewModel 优先(或 MVVMC)是唯一可行的方法吗?

最佳答案

MVVM pattern says that business logic should be proceeded in ViewModel.

这个是完全错误的。您永远不会将业务逻辑放入 ViewModel。 ViewModel 是表示,所以这里只有表示逻辑(输入验证,控制何时显示或隐藏哪个元素,以及存在哪些命令供用户在特定事件上执行或连接您的域对象,类似于您在内部所做的MVC 中的 Controller 操作)。

业务逻辑显然是您域的一部分,永远不应离开域。

ViewModels 只准备域(模型层;MVVM 的 M)的数据,供 View 轻松使用。

I want to keep best practices and create every object in composition root

Application.OnStartup 仍然是执行此操作的正确位置,因为应用程序层(在 n 层术语中)是唯一了解所有内容(ViewModel、模型、域和基础设施)的层您可以在那里进行特定于应用程序的配置,例如添加 IUserRepository 可以是桌面上的 SqlServerUserRepository 和 UWP 应用程序上的 SqliteUserRepository,因为那里没有 SQL Server。

关于c# - MVVM DDD 应用程序中的组合根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165935/

相关文章:

c# - 如何在 C# 中管道 powershell 命令

c# - 嵌套 if ... else 流的更简单/更有效的方法?

c# - 如何创建一个 csv 并附加到电子邮件并在 C# 中发送

wpf - 如何将 menuitem.click 绑定(bind)到不同 View 模型中的命令

c# - 通过 C# 刷新并保存 excel 文件

c# - Entity Framework 核心并从sqlite数据库获取表列表

c# - 通过 HttpClient.PostAsync 的 POST 请求,主体内有 StorageFile (WinRT)

c# - 在后台观看 CD

c# - 如何将 ViewModel 属性验证与 ViewModel 分离?

wpf - 如何同步关闭 WPF 应用程序?