c#-依赖注入和MVVM中的单一职责原则
作者:互联网
使用DI和构造函数注入时,有一个有用的指示符表明是否违反了SRP,因为构造函数的参数数量将增加到我们开始感到不安的数量.通过将其重构为明智的量身定制的类并使用立面服务和类似方法来解决这一问题.
但是,对于MVVM尤其是视图模型,我很难应用这些规则.视图模型本质上负责提供命令,这些命令在被调用时会执行一些UI逻辑并调用业务层.我不想开始讨论在何处放置业务逻辑,因此我们同意将其放在单独的类中.
现在想象一个简单的场景:我们有一个带有文件列表的窗口.用户可以在重命名和打开包含的文件夹时添加文件,删除文件并对其进行一些处理.该窗口还异步收集并在列表的列中显示文件的一些元数据.此外,用户可以打开详细信息视图并触发在线帮助.所有这些都可以通过工具栏和上下文菜单完成.好吧,让我们在这里停止功能.一种直接的群集功能方法可能是:
> ViewModel(对于整个窗口,为
提到的功能)
视图模型的依赖关系:
>文件处理
> WindowsExplorerService(打开资源管理器窗口
显示包含的文件夹)
>在线帮助
>元数据收集器
> MessageService(打开消息框以显示错误和
喜欢)
> DetailsService(提供UI以显示已知的详细信息
文件格式)
已经有6个依赖项,通过添加可以从工具栏触发的功能很容易增加数量.在我看来,依赖关系不能隐藏在合理的外观服务后面,因为它们各自涵盖了完全不同的功能领域(好吧,我们可以讨论MetadataGatherer和FileManipulation).
我认为视图模型的特殊之处在于,它们将用户操作的转发封装为非常不同的依赖项.
但是,有6个或更多的依赖项使我感到不安,并且各个构造函数的气味很差.我想念一个重点吗?一般如何重构这样的案例有什么想法?
解决方法:
解决方案是使用合成.主窗口需要由元素组成,每个元素将具有自己的视图模型,并且该视图模型将处理单个职责.主视图模型将对它们进行编排.他们可以使用事件总线相互通信.几乎所有流行的MVVM框架(我对Caliburn Micro和ReactiveUI都了解)都支持此功能.
标签:single-responsibility-principle,dependency-injection,solid-principles,c,mvvm 来源: https://codeday.me/bug/20191025/1932363.html