所以,答案应该很简单:正如 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/