我最近切换到 Enterprise Library 5 和 Unity。我对提供的示例非常满意,直到我四处浏览并开始阅读有关“服务定位器是一种反模式”的嘶嘶声。从那里我偶然发现了关于 Composite Root 和好莱坞校长“不要打电话给我们,我们会打电话给你”的著作。
我想我了解 Composite Root 的好处,但我不明白我们如何避免调用它以获取应用程序所需的类的实例。所以我想我可能误解了整个想法。
我将其作为一种新的方式来实现集中式工厂模式。但是在某些时候我仍然需要调用工厂模式来获取我的实例?因此,对于我读过的以下代码,Unity Container 应该创建在应用程序根附近的某个位置(而不是在表单中)。这反过来应该照顾我的 DI 以进行异常处理和日志记录。(请注意,这只是 2 分钟的播放代码,因此毫无意义)
public partial class Form1 : Form
{
public IUnityContainer Container { get; protected set; }
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.Container = new UnityContainer().AddNewExtension<EnterpriseLibraryCoreExtension>();
try
{
throw new NullReferenceException("Mucking around.");
}
catch (Exception ex)
{
TaxCalculator calc = this.Container.Resolve<TaxCalculator>(new ParameterOverride("fire", 888));
calc.LogWriter.Write(calc.Fire, "muckaround");
}
}
public class TaxCalculator
{
private ExceptionManager _exceptionManager;
public LogWriter LogWriter { get; protected set; }
public string Fire { get; set; }
public TaxCalculator(ExceptionManager em, LogWriter lw, int fire)
{
this._exceptionManager = em;
this.LogWriter = lw;
this.Fire = fire.ToString();
}
}
麻烦的是,如果我不能调用 TaxCalculatorFactory 反过来调用容器,或者只是调用容器本身,我如何获得特定类型的税收计算器?
我如何/从哪里获取我的实例?我是否启动应用程序,构建一堆在应用程序生命周期中可能需要或不需要的工厂,然后从工厂获取应用程序请求实例的各个层?好像我会传递很多工厂参考资料,所以我不确定有什么好处?还是我在容器中初始化静态类并调用它们?
正如你所看到的,我对好莱坞校长的想法一头雾水。