代码之家  ›  专栏  ›  技术社区  ›  Wim Coenen

依赖注入容器:如何处理不依赖任何东西的对象?

  •  2
  • Wim Coenen  · 技术社区  · 14 年前

    当我们使用依赖注入容器时,理想情况下,我们只从中提取一个顶层对象(例如 Program

    Notifier 带a的班级 Bazinga BazingaConsoleLogger 班级:

    public class BazingaConsoleLogger
    {
        private readonly Notifier notifier;
    
        public BazingaConsoleLogger(Notifier notifier)
        {
            this.notifier = notifier;
            this.notifier.Bazinga += HandleBazinga;
        }
    
        private void HandleBazinga(object sender, EventArgs args)
        {
            Console.WriteLine("Bazinga!");
        }
    }
    

    巴辛加控制台记录器

    3 回复  |  直到 14 年前
        1
  •  5
  •   Mauricio Scheffer    14 年前

    我不认为这是你真正的意思,所以你能进一步解释一下你目前是如何使用BazingaConsoleLogger的吗?如果你

    Windsor's Event Wiring facility . 如果你的容器里没有类似的东西,那么编写代码应该不难, here are the general principles .

        2
  •  3
  •   Krzysztof Kozmic    14 年前

    在温莎,你可以这样做:

    container.Register(
       Component.For<Notifier>()
          .OnCreate((kernel, notifier) => 
             notifier.Bazinga += kernel.Resolve<BazingaConsoleLogger>().HandleBazinga)
    );
    

    不过,我同意毛里西奥谢弗,我会把这当作气味和重新考虑你的设计在这种情况下。

        3
  •  0
  •   Wim Coenen    13 年前

    A IListener

    container.Resolve<IEnumerable<IListener>>(); // just to create the listeners
    var program = container.Resolve<Program>();
    program.Run();
    

    另一种选择是使用 IStartable inspired by Autofac )它解决了一个更普遍的问题,即在启动时启动多个服务。对于事件侦听器类 Start 方法可以用于订阅事件(从而从构造函数中移除此职责),也可以不执行任何操作。这个 Program 班级可能是 实现。

    var startables = container.Resolve<IEnumerable<IStartable>>();
    foreach (var startable in startables)
    {
        startable.Start();
    }