Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何减少臃肿的WPF主窗口中的依赖关系?_Wpf_Design Patterns_Mvvm - Fatal编程技术网

如何减少臃肿的WPF主窗口中的依赖关系?

如何减少臃肿的WPF主窗口中的依赖关系?,wpf,design-patterns,mvvm,Wpf,Design Patterns,Mvvm,我正在开发一个大型WPF应用程序,大部分功能只驻留在一个窗口中。我使用Autofac进行DI,并尝试保持MVVM模式。我使用了ViewModel,直到一个还不够。然后,我将其分为若干视图模型。然后出现了助手对象,我将事件绑定到的新窗口,等等 我的主窗口现在有一个类似以下内容的构造函数: public MainWindow( IConnectionViewModel connectionViewModel, IFilterViewModel filterViewM

我正在开发一个大型WPF应用程序,大部分功能只驻留在一个窗口中。我使用Autofac进行DI,并尝试保持MVVM模式。我使用了ViewModel,直到一个还不够。然后,我将其分为若干视图模型。然后出现了助手对象,我将事件绑定到的新窗口,等等

我的主窗口现在有一个类似以下内容的构造函数:

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或以其他方式更改构造函数注入器以实现自动注入。我特别喜欢你所说的划分。我将尝试一下,看看是否可以降低复杂性。非常感谢。