【问题标题】:Composition Root in MVVM DDD applicationMVVM DDD 应用程序中的组合根
【发布时间】:2016-02-02 23:40:37
【问题描述】:

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

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

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

应用程序服务 WPF客户端(ViewModels PCL

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

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

  • 我想保持最佳实践并在组合根目录中创建每个对象
  • 我想让我的业务对象在视图模型中,而不是在视图中

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

【问题讨论】:

    标签: c# .net wpf mvvm


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 啊,我用错词了:/ 我的意思是:当你在类 Game 中有业务逻辑(在域中)时,它有方法 Move,如果移动完成游戏 - 你的视图中不需要Game。您需要一个命令 - ViewModel 中的 MoveCommandGame。 View 应该只知道该命令
    • 正确。但是组合根并不意味着您必须在那里初始化/创建您的类(去掉一些必要的特殊情况并且与应用程序具有相同的生命周期)。如果你使用你的 IoC 容器,你只需在这里配置它。对象是按需创建的,根据需要/通过 IoC 容器解决,这使得布线变得更加容易。尽管 MVVM 对于大多数游戏来说并不理想
    • 一天结束时,我在App 类中创建了我的业务对象,在OnStartup 方法中。我在我的一个 ViewModel 中需要它——我不需要它。所以我的新解决方案是:我将在该对象的App 中创建一个公共静态属性(例如public static Game MyGame;),当有人打开视图时,ViewModelLocator 决定创建特定的 ViewModel,然后我将创建 ViewModel 传递 App。 MyGame 进入它。它会像:“我会创建你知道的,我会在这里存储在静态公共财产中,并在我需要你时给你打电话” - 但我认为这不是最好的解决方案
    • 虽然我使用Pure DI,但我会做与 IoC 容器相同的操作。在组合根目录中创建所有内容,稍后使用。唯一的问题是,我无法将参数传递给 ViewModelLocator,这就是为什么我需要将其存储为全局变量:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2011-03-04
    • 2011-11-14
    • 2013-02-22
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多