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 解决依赖关系。以上均为InTransientScope
。 IBar
由工厂方法提供,该方法使用 IFooContext
属性之一进行创建。我想要实现的是使用注入 Foo
.
的相同 IBar
实例将 Service
注入 Foo
我不知道如何用 Ninject 实现这个。有可能吗?如果没有,我正在考虑在 IService
中公开 IBar
属性 并将其设置在 Foo
构造函数中,但老实说我不喜欢这个想法。
为了...简单起见,我简化了案例,但实际上 Foo
是 Rebus 消息处理程序,IFooContext
是消息上下文,IBar
是记录器。我想格式化记录器消息,以便它们包含来自正在处理的 Rebus 消息的 ID。我希望 Foo
和 Service
的日志事件都具有该 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的文档中读到的内容来看,它似乎也是解决这个问题的有效方法。
谢谢。
我将解释一个疯狂的依赖注入案例,但首先让我向您展示一些代码:
class Foo : IFoo
{
Foo(
IBar bar,
IFooContext context,
IService service)
{
...
}
}
class Service : IService
{
Service(
IBar bar)
{
...
}
}
我正在使用 Ninject 解决依赖关系。以上均为InTransientScope
。 IBar
由工厂方法提供,该方法使用 IFooContext
属性之一进行创建。我想要实现的是使用注入 Foo
.
IBar
实例将 Service
注入 Foo
我不知道如何用 Ninject 实现这个。有可能吗?如果没有,我正在考虑在 IService
中公开 IBar
属性 并将其设置在 Foo
构造函数中,但老实说我不喜欢这个想法。
为了...简单起见,我简化了案例,但实际上 Foo
是 Rebus 消息处理程序,IFooContext
是消息上下文,IBar
是记录器。我想格式化记录器消息,以便它们包含来自正在处理的 Rebus 消息的 ID。我希望 Foo
和 Service
的日志事件都具有该 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的文档中读到的内容来看,它似乎也是解决这个问题的有效方法。
谢谢。