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

Ninject: Get the instance injected to a parent object

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

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

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

我正在使用 Ninject 解决依赖关系。以上均为InTransientScopeIBar 由工厂方法提供,该方法使用 IFooContext 属性之一进行创建。我想要实现的是使用注入 Foo.

的相同 IBar 实例将 Service 注入 Foo

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

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

这可以用Ninject.Extensions.NamedScope

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

感谢 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的文档中读到的内容来看,它似乎也是解决这个问题的有效方法。

谢谢。