将Ninject NamedScope定义对象注入其自己的范围

时间:2015-08-10 08:56:21

标签: c# dependency-injection scope ninject

我有一个绑定在Ninject中的对象:

Bind<IScopeRoot>().To<ScopeRoot>()
    .DefinesNamedScope("DemoScope"); 

该范围内有多个对象:

Bind<IRootedObject>().To<RootedObject>()
   .InNamedScape("DemoScope");

我遇到的问题是将IScopeRoot注入RootedObject将创建一个新的ScopeRoot实例(新的DemoScope的根),而不是注入范围定义对象。

我使用的解决方法是创建一个人工根对象,它只是实际根对象的容器,但我觉得这很难看,它会弄乱我的架构。

有没有一种很好的方法可以将范围定义对象注入其自己的范围?

1 个答案:

答案 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");

替代方案:ToMethod绑定

 Bind<ScopeRoot>.ToSelf()
     .InNamedScope("ScopeName");
 Bind<IScopeRoot>()
     .ToMethod(ctx => ctx.Kernel.Get<ScopeRoot>(
           new NamedScopeParameter("ScopeName");
Bind<IRootedObject>().To<RootedObject>()
     .InNamedScope("ScopeName");

也许还有更优雅的方法来实现这一目标。