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