0

I'm developing a large WPF application and most of the functionality resides in just one window. I use Autofac for DI and I try to keep to the MVVM pattern. I used a ViewModel, until one wasn't enough. I then separated into a number of ViewModels. Then helper objects appeared, new windows to which I tied events, and so forth.

My MainWindow now has a constructor that looks something like this:

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)

What is perhaps worse is that this file is over 300 lines long! Before I add yet another dependency to this monstrosity, can someone give me an idea of what refactoring needs to be done? What abstraction(s) am I missing?

4

2 回答 2

1

如果您的MainWindow. 使用 IoC 容器和您MainWindow在 MVVM 中,您应该只注入MainWindows ViewModel 类,将其 DataContext 设置为该创建的类。

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

如果您的 MainWindow XAML 非常复杂,请考虑将 UI 元素划分为UserControls、ContentControl片段或自定义控件,您可以将其与 ViewModel 相关联,专注于仅呈现特定功能的 UI。这将使您能够对关注点分开的 UI 元素进行类级别的控制。如果我要使用这种方法,那么我将在我的 MainWindow VM 中将不同的 ViewModel 类作为属性公开,并使用“ ”语法将子元素设置DataContext为这些属性。{Binding SomeProperty}

在为 WPF 进行架构设计时,我通常首先尝试从 View、ViewModel 和 Model 类之间的一对一关系开始,如果有帮助的话,将公共元素重构为基类。这很好地解决了复杂的 UI 问题,但如果您需要在模型或 ViewModel 类之间进行通信,则会引入问题。

为了解决这个问题,我转向了 Prism 消息传递发布和订阅模式,使用CompositePresentationEventApp.xaml 中的类定义在我需要的几个地方绕过所有这些分离。无需使用 Prism 库的任何其他部分即可轻松使用它们,如果您不想在运行时出现 Prism 膨胀,当然可以使用其他消息传递程序。

于 2013-07-25T00:29:31.713 回答
1

除了你自己,没有人能真正帮助你,我这么说是因为重构这种称为构造函数过度注入的反模式的唯一方法,顺便说一下,这是违反(SRP)单一责任原则的症状,唯一的方法是找到这些依赖关系之间的共性并将相关的组合到他们自己的类中。

例如,我可以看到IDialogViewModelIDialogViewModel2这似乎与我很相关。 IAnotherViewModel并且IYetAnotherViewModel看起来像候选人等等等等。

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

于 2013-07-24T23:42:53.747 回答