MVVM DDD应用程序中的组合根

时间:2016-02-02 23:40:38

标签: c# .net wpf mvvm

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

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

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

< - 应用服务< - WPF客户端(ViewModels PCL< - 带视图的可执行WPF客户端)

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

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

  • 我想保留最佳实践并在撰写根目录中创建每个对象
  • 我想在视图模型中使用我的业务对象,而不是在视图中

ViewModel-first(或MVVMC)是唯一可行的方法吗?

1 个答案:

答案 0 :(得分:1)

  

MVVM模式表明业务逻辑应该在ViewModel中进行。

这个完全错了。您从不将业务逻辑放入ViewModel。 ViewModel是演示文稿,因此只有表示逻辑进入此处(输入验证,控制何时以及显示或隐藏哪个元素以及用户在特定事件上执行或连接域对象的命令,类似于您在内部执行的操作MVC中的控制器动作。

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

ViewModels只为视图准备域(模型层; MVVM)的数据,以便轻松使用它。

  

我想保留最佳实践并在合成根目录中创建每个对象

Application.OnStartup仍然是正确的选择,因为应用层(以n层术语)是唯一知道所有内容的层(ViewModels,Model,Domain和Infrastructure),你可以做到特定于应用程序的配置,例如添加IUserRepository可能是桌面上的SqlServerUserRepository和UWP应用上的SqliteUserRepository,因为SQL Server在那里不可用。