1

我最近切换到 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 反过来调用容器,或者只是调用容器本身,我如何获得特定类型的税收计算器?

我如何/从哪里获取我的实例?我是否启动应用程序,构建一堆在应用程序生命周期中可能需要或不需要的工厂,然后从工厂获取应用程序请求实例的各个层?好像我会传递很多工厂参考资料,所以我不确定有什么好处?还是我在容器中初始化静态类并调用它们?

正如你所看到的,我对好莱坞校长的想法一头雾水。

4

1 回答 1

0

服务定位器的一种替代方法是使用可以在对象创建期间注入依赖项的 IoC 容器。

这个 SO question提出了一个类似的问题,它指向这篇Autofac 文章对象引用类型。它应该给你一些关于 IoC 容器如何解决这个问题的想法。

于 2012-10-16T22:44:23.130 回答