我最近切换到了Enterprise Library 5和Unity。我对提供的示例感到非常满意,直到我四处浏览并开始阅读关于“服务定位器是反模式”的嘶嘶声。从那里我偶然发现了复合根和好莱坞校长的着作“不要打电话给我们,我们会打电话给你”。
我想我理解Composite Root的好处,但我不明白我们如何避免调用它来获取应用程序所需的类的实例。所以我想我可能会误解整个想法。
我接近这个作为一种集中工厂模式的新方法。但在某些时候我仍然需要调用工厂模式来获取我的实例?因此,对于下面的代码,我读过Unity容器应该在应用程序根目录附近创建(不是在表单中)。反过来,这应该照顾我的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来调用容器,或者只是调用容器本身,我该如何获得特定类型的Tax Calculator?
我如何/从何处获取我的实例?我是否启动了应用程序,在应用程序生命周期内构建了一堆我可能需要或可能不需要的工厂,然后从工厂获取应用程序请求实例的各个层?好像我要经过很多工厂参考,所以我不确定它的好处是什么?或者我在容器中初始化静态类并只调用它们?
正如你所看到的,我处于混乱状态:好莱坞校长的想法。
答案 0 :(得分:0)
服务定位器的一种替代方法是使用可在对象创建期间注入依赖项的IoC容器。
This SO question提出了一个类似的问题,指出了Autofac article on object reference types。它应该为您提供有关IoC容器如何解决此问题的一些想法。