我有一个绑定在Ninject中的对象:
Bind<IScopeRoot>().To<ScopeRoot>()
.DefinesNamedScope("DemoScope");
该范围内有多个对象:
Bind<IRootedObject>().To<RootedObject>()
.InNamedScape("DemoScope");
我遇到的问题是将IScopeRoot注入RootedObject将创建一个新的ScopeRoot实例(新的DemoScope的根),而不是注入范围定义对象。
我使用的解决方法是创建一个人工根对象,它只是实际根对象的容器,但我觉得这很难看,它会弄乱我的架构。
有没有一种很好的方法可以将范围定义对象注入其自己的范围?
答案 0 :(得分:1)
内部Ninject在NamedScopeParameter
(=&gt;绑定ScopeRoot
)的上下文中放置.DefinesNamedScope
。
警告:我实际上还没有编译以下任何代码,但从概念上讲它应该可行。随意修复我所犯的任何错误。
我们遇到了同样的问题,我们过去常常实现IScopeRootFactory
:
internal class ScopeRootFactory : IScopeRootFactory
{
private readonly IResolutionRoot resolutionRoot;
public ScopeRootFactory(IResolutionRoot resolutionRoot)
{
this.resolutionRoot = resolutionRoot;
}
public IScopeRoot CreateScopeRoot()
{
return this.resolutionRoot.Get<IScopeRoot>(new NamedScopeParameter("ScopeName");
}
}
您的绑定将如下所示:
Bind<IScopeRootFactory>().To<ScopeRootFactory>();
Bind<IScopeRoot>().To<ScopeRoot>()
.InNamedScope("ScopeName");
Bind<IRootedObject>().To<RootedObject>()
.InNamedScope("ScopeName");
Bind<ScopeRoot>.ToSelf()
.InNamedScope("ScopeName");
Bind<IScopeRoot>()
.ToMethod(ctx => ctx.Kernel.Get<ScopeRoot>(
new NamedScopeParameter("ScopeName");
Bind<IRootedObject>().To<RootedObject>()
.InNamedScope("ScopeName");
也许还有更优雅的方法来实现这一目标。