【发布时间】:2016-01-31 04:53:19
【问题描述】:
我正在重构一个小型报告生成应用程序,并使其符合 SOLID 原则等。因此,我所有的类都遵循带有 DI 的 SRP,并且我使用 app.config 来处理大多数参数变化。我还没有使用任何 DI 框架,而是在应用程序入口点创建所有依赖类。然而,这导致了一个设计问题,我在这里概括一下:
我可以像这样创建我的依赖项和主要报告类:
//dependencies
var sharedDependency = new SharedDependency();
var whiteColorDependency = new ColorDependency("white");
var blueColorDependency = new ColorDependency("blue");
var config1Dependency = new MultiDependency("config1");
var config2Dependency = new MultiDependency("config2");
...
var config12Dependency = new MultiDependency("config12");
//main logic
var reporter1 = new Reporter(sharedDependency, whiteColorDependency, config1Dependency);
var reporter2 = new Reporter(sharedDependency, whiteColorDependency, config2Dependency);
var reporter3 = new Reporter(sharedDependency, whiteColorDependency, config3Dependency);
...
var reporter10 = new Reporter(sharedDependency, blueColorDependency, config10Dependency);
var reporter11 = new Reporter(sharedDependency, blueColorDependency, config11Dependency);
var reporter12 = new Reporter(sharedDependency, blueColorDependency, config12Dependency);
或类似:
foreach (var config in configs)
{
//dependencies
var sharedDependency = new SharedDependency();
var colorDependency = new ColorDependency("color");
var configDependency = new MultiDependency("config");
//main logic
var reporter = new Reporter(sharedDependency, colorDependency, configDependency);
reporter.DoSomething();
}
?
(“colors”和“config”的值都是来自app.config文件,不是硬编码的。上面说的是概括,实际项目有更多依赖关系,依赖关系的依赖关系,其中一些比其他的共享更多。)
第一种方法效率更高,因为 CSharedDependency 只创建一次,CColorDependency 只创建两次。 (它对我来说也更具可读性。)不过,第二个是完全配置驱动的,因此需要零维护并且完全可扩展。
那么,哪一个是最好的设计?
【问题讨论】:
-
为什么不能结合这两种方法?您不能在循环之外创建共享依赖项吗?我不清楚这个问题,因为循环替代方案不使用
config... -
@MarkSeemann 循环替代方案确实将
.config用于“颜色”和“配置”值 - 这是我的问题。我可以在循环之外创建共享依赖项吗?是的,这就是方法 1。问题在于我必须明确指定哪些Reporters使用whiteColorDependency,哪些使用blueColorDependency。所以,如果我要添加另外两个(或五个)Reporters,我必须修改代码。使用循环方法,这一切都完全由.config驱动并且非常可扩展......但是,我必须拥有 12 个以上的ColorDependency实例而不是 2 个。 -
“循环替代方案确实使用
.config”。在哪里? -
"white", "blue" 真的来自
ConfigurationManager.AppSettings["white"],ConfigurationManager.AppSettings["blue"]。 “config1”到“config12”也一样。
标签: c# dependency-injection configuration-files solid-principles single-responsibility-principle