好莱坞原则:我不明白

时间:2012-10-09 01:12:38

标签: design-patterns

我最近切换到了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?

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

正如你所看到的,我处于混乱状态:好莱坞校长的想法。

1 个答案:

答案 0 :(得分:0)

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

This SO question提出了一个类似的问题,指出了Autofac article on object reference types。它应该为您提供有关IoC容器如何解决此问题的一些想法。