如何减少臃肿的WPF MainWindow中的依赖项?

时间:2013-07-24 22:10:00

标签: wpf design-patterns mvvm

我正在开发一个大型WPF应用程序,大多数功能只存在于一个窗口中。我使用Autofac进行DI,我尝试保持MVVM模式。我使用了一个ViewModel,直到一个还不够。然后我分成了许多ViewModels。然后出现了辅助对象,我将事件绑定到的新窗口,等等。

我的MainWindow现在有一个看起来像这样的构造函数:

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行!在我为这个怪物添加另一个依赖之前,有人可以让我知道需要进行哪些重构吗?我错过了哪些抽象?

2 个答案:

答案 0 :(得分:1)

除了你自己,没有人可以真正帮助你,我这样说是因为重构这种反模式的唯一方法是Constructor Over-Injection,而 - 顺便说一下 - 是违反(SRP)Single Responsibility Principle的症状,唯一的方法是找到这些依赖关系和组相关关系之间的共性。

例如,我可以看到IDialogViewModelIDialogViewModel2,这似乎与我很相关。 IAnotherViewModelIYetAnotherViewModel似乎也是候选人等等。

将这些依赖项分组到其他类中将减少参数的数量,并允许您将300多行代码中的一些移动到它们真正属于的位置,从长远来看,这也应该有助于SRP。

答案 1 :(得分:1)

如果你的MainWindow中有很多依赖项,那么你似乎并没有真正使用MVVM模式。使用IoC容器和MVVM中的MainWindow,您应该只注入MainWindow的ViewModel类,将其DataContext设置为该创建的类。

ViewModel的构造函数或构建数据模型并将其提供给VM的某个任务将处理其余的构造。

如果您的MainWindow XAML非常复杂,请考虑将UI元素划分为UserControlContentControl代码段或自定义控件,您可以将其与ViewModel相关联,专注于仅呈现特定的UI一点功能。这将为您提供对其关注点分离的UI元素的类级控制。如果我要使用这种方法,那么我会将不同的ViewModel类公开为我的MainWindow VM中的属性,并使用“DataContext”语法将子元素“{Binding SomeProperty}设置为这些属性。” / p>

在构建WPF时,我通常会尝试从最初的View,ViewModel和Model类之间的一对一关系开始,如果它有帮助,可以将公共元素重构为基类。这很好地打破了复杂的UI问题,但是如果需要在模型或ViewModel类之间进行通信,则会引入问题。

为了解决这个问题,我转向Prism消息传递发布和订阅模式,使用App.xaml中的CompositePresentationEvent类定义来解决我需要它的几个地方的所有分离。在不使用Prism库的任何其他部分的情况下使用它们很容易,如果你不想在运行时使用Prism-bloat,你当然可以使用其他消息传递者。

相关问题