Ninject:获取实例注入到父对象

时间:2019-07-04 14:11:23

标签: c# .net logging dependency-injection ninject

我有一个疯狂的依赖注入案例,我将对其进行解释,但首先让我向您展示一些代码:

  class Foo : IFoo
  {
    Foo(
      IBar bar,
      IFooContext context,
      IService service)
    {
      ...
    }
  }

  class Service : IService
  {
    Service(
      IBar bar)
    {
      ...
    }
  }

我正在使用Ninject解决依赖关系。以上所有都是InTransientScopeIBar由工厂方法提供,该工厂方法使用IFooContext属性之一进行创建。我想要实现的是,将Service注入到Foo中,并注入IBar中相同的Foo实例。

我不知道如何使用Ninject实现这一目标。可能吗如果没有,我正在考虑在IBar中公开IService属性,并在Foo构造函数中进行设置,但老实说,我不喜欢这个想法。

为简化起见,我简化了案例,但实际上Foo是Rebus消息处理程序,IFooContext是消息上下文,IBar是记录程序。我想格式化记录器消息,以便它们包括正在处理的Rebus消息中的ID。我希望FooService的日志事件都具有该ID。

2 个答案:

答案 0 :(得分:1)

这可以通过Ninject.Extensions.NamedScope

解决
kernel.Bind<IFoo>().To<Foo>().DefinesNamedScope("FooScope");
kernel.Bind<IBar>().To<Bar>().InNamedScope("FooScope");

答案 1 :(得分:1)

感谢Nkosi向我指出了正确的方向,我设法得到了想要的东西:

Bind<IFoo>()
  .To<Foo>
  .InScope(ctx => FooContext.Current);

Bind<IBar>()
  .ToMethod(ctx =>
  {
    var scope = ctx.GetScope() as IFooContext;
    // Some logic to create Bar by IFooContext...
  });

Bind<IService>()
  .To<Service>
  .InScope(ctx => FooContext.Current);

正如我所说,实际上Foo是Rebus消息处理程序。在我的示例中,这意味着每个Foo都会创建一个新的IFooContext,并且我也可以访问当前的{}。

对于Jan Muncinsky的答案-我没有进行测试,但是从Ninject文档中读取的内容来看,这似乎也是解决此问题的有效方法。

谢谢。