Unity 2.0:如何在CTor注入上创建子容器?

时间:2010-06-25 16:44:51

标签: dependency-injection inversion-of-control unity-container ioc-container

我有一个MessageSender类,其构造函数如下所示:

    public MessageSender(IInputComponent input, IOutputComponent output)
    {
        m_Input = input;
        m_Output = output;
    }

这是我实例化它的方式:

    Container.RegisterType<IMessageSender, MessageSender>();
    Container.RegisterType<IInputComponent, KeyboardInput>();
    Container.RegisterType<IOutputComponent, ScreenOutput>();
    Container.RegisterType<ILogger, Logger>();
    return Container.Resolve<IMessageSender>();

这是KeyboardInput的构造函数:

    public KeyboardInput(IUnityContainer container)
    {
        m_Container = container;
        m_Logger = container.Resolve<ILogger>();
    }

我希望KeyboardInput实例接收一个子容器到它的构造函数,因此它将从子容器而不是父容器中解析它的记录器。

我该如何实现?

谢谢!

1 个答案:

答案 0 :(得分:3)

您不应该在KeyboardInput或任何其他类中依赖IUnityContainer。 DI容器应该解决所有组件并且不要使用 - 我称之为Hollywood Principle for DI。保持对容器的引用会导致Abstract Service Locator anti-pattern,这是一个非常糟糕的主意。

KrzysztofKoźmic最近的这些帖子很好地解释了这一点:

始终可以重新设计对象模型,以便不需要引用容器。为什么你认为你需要在KeyboardInput中使用容器?