【发布时间】:2014-07-18 01:50:57
【问题描述】:
阅读这个问题How to avoid Dependency Injection constructor madness? 后,我仍然对我的应用程序设计有些顾虑。假设我有一个类在其构造函数中接受很少的参数:
public class SampleViewModel
{
public SampleViewModel(IReader1 reader1, IReader2 reader2, IReader3 reader3)
{
// ...
}
}
IReaderX 是一个用于从不同来源检索数据的接口,如下所示:
public interface IReader1
{
int Value1 { get; }
string Value2 { get; }
}
现在,如果我想将这些接口聚合为一个,我将不得不创建另一个类,比如ReaderManager,它将充当底层类属性的包装器。很多管道代码。不好,如果你问我。
我尝试使用 Composition 并将所有阅读器作为 ReaderManager 类中的属性,但如果我试图在外部使用这些阅读器,则会违反得墨忒耳定律。
所以问题是:我应该如何减少不相互通信并且只公开属性而不是内部逻辑的构造函数依赖项的数量?
【问题讨论】:
-
您的视图模型能否拆分为需要较少参数的较小视图模型?
-
并非如此。这是核心视图模型,它从应用程序开始并管理其他窗口。它必须使用来自所有阅读器的验证数据,并在此基础上更改视图的状态。
-
是不是因为不同的数据源的接口也不同,难道不能有一个接口被所有数据源实现,这样就可以用一个接口的List作为依赖?
-
每个接口从不同的源读取不同的数据。它们有很多属性,将它们绑定在一起最终会形成巨大的类,这也违反了 SRP。
-
很难说,因为您发布的代码非常通用,并没有透露 ViewModel 的职责。但是,如果您的读者非常不同,那么 Ned Stoyanov 考虑拆分 ViewModel 的建议听起来是正确的。甚至您对它的描述听起来都像是有太多职责(启动应用程序、管理窗口、加载数据、验证、更改视图状态)。
标签: c# design-patterns dependency-injection