如何减少臃肿的WPF主窗口中的依赖关系?
我正在开发一个大型WPF应用程序,大部分功能只驻留在一个窗口中。我使用Autofac进行DI,并尝试保持MVVM模式。我使用了ViewModel,直到一个还不够。然后,我将其分为若干视图模型。然后出现了助手对象,我将事件绑定到的新窗口,等等 我的主窗口现在有一个类似以下内容的构造函数:如何减少臃肿的WPF主窗口中的依赖关系?,wpf,design-patterns,mvvm,Wpf,Design Patterns,Mvvm,我正在开发一个大型WPF应用程序,大部分功能只驻留在一个窗口中。我使用Autofac进行DI,并尝试保持MVVM模式。我使用了ViewModel,直到一个还不够。然后,我将其分为若干视图模型。然后出现了助手对象,我将事件绑定到的新窗口,等等 我的主窗口现在有一个类似以下内容的构造函数: public MainWindow( IConnectionViewModel connectionViewModel, IFilterViewModel filterViewM
public MainWindow(
IConnectionViewModel connectionViewModel,
IFilterViewModel filterViewModel,
IAnotherViewModel anotherViewModel,
IPipeline pipeline,
IWorkingScreens workingScreens,
IClientSideConnectionManager clientSideConnectionManager,
IYetAnotherViewModel yetAnotherViewModel,
IDialogViewModel dialogViewModel,
IDialogViewModel2 dialogViewModel2,
IDetailWindow detailWindow,
IAnotherWindow anotherWindow,
IApplicationController applicationController
)
: base(workingScreens)
更糟糕的是,这个文件超过300行!在我向这个怪物添加另一个依赖项之前,有人能告诉我重构需要做什么吗?我缺少什么抽象?除了你自己,没有人能真正帮助你,我这么说是因为重构这个被调用的反模式的唯一方法,顺便说一句,它是违反(SRP)的症状,唯一的方法是找到这些依赖项之间的共性,并将相关依赖项分组到它们自己的类中 例如,我可以看到
IDialogViewModel
,IDialogViewModel2
,它们似乎与我很相关。
iOtherViewModel
和iYetAnothService模型
似乎也是候选模型,依此类推
将这些依赖项分组到其他类中可以减少参数的数量,并可以让您将300多行代码中的一些移到它们真正属于的位置,从长远来看,这些代码也应该有助于SRP。如果您的系统中有那么多依赖项,那么您似乎没有真正使用MVVM模式
main窗口
。使用IoC容器和MVVM中的MainWindow
,您应该只注入MainWindow
s ViewModel类,将其DataContext设置为所创建的类
ViewModel的构造函数,或者构建数据模型并将其提供给VM的某个任务,将处理其余的构造
如果主窗口XAML非常复杂,请考虑将UI元素划分为<代码> UserControl <代码> >、<代码>内容控件> />代码片段或自定义控件,这些控件可以与只显示特定功能的UI的VIEW模型关联。这将使您能够在类级别控制关注点分离的UI元素。如果我使用这种方法,那么我将在主窗口VM中公开不同的ViewModel类作为属性,并使用“
{Binding SomeProperty}
”语法将子元素“DataContext
设置为这些属性
在为WPF设计架构时,我通常尝试从视图、视图模型和模型类之间的一对一关系开始,如果有帮助的话,将公共元素重构为基类。这很好地解决了复杂的UI问题,但如果您需要在model或ViewModel类之间通信,则会引入问题
为了解决这个问题,我转向了Prism消息传递发布和订阅模式,使用App.xaml中的
CompositePresentationEvent
类定义,在我需要它的几个地方绕过所有分离。不用使用Prism库的任何其他部分就可以轻松地使用这些消息,如果您不希望Prism在运行时膨胀,您当然可以使用其他消息传递程序 天哪,那到底是什么?不管怎样,具有3+个参数的构造函数都是不好的。视图的参数化构造函数更糟糕。你为什么要把这些都放在窗户里?另外,使用MEF或以其他方式更改构造函数注入器以实现自动注入。我特别喜欢你所说的划分。我将尝试一下,看看是否可以降低复杂性。非常感谢。