Asp.net web api Ninject 3-BeginBlock()是否覆盖asp.net WebAPI中的InRequestScope?

Asp.net web api Ninject 3-BeginBlock()是否覆盖asp.net WebAPI中的InRequestScope?,asp.net-web-api,ninject,ninject.web,Asp.net Web Api,Ninject,Ninject.web,我的asp.net WebApi项目包含多个用于服务、核心和数据访问的程序集。为了在项目中使用Ninject作为我的DI容器,我从NuGet添加了Ninject.Web.Common包。然后,我将IDependencyResolver实现为: public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver { readonly IKernel kernel; public

我的asp.net WebApi项目包含多个用于服务、核心和数据访问的程序集。为了在项目中使用Ninject作为我的DI容器,我从NuGet添加了Ninject.Web.Common包。然后,我将IDependencyResolver实现为:

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
    readonly IKernel kernel;

    public NinjectDependencyResolver(IKernel kernel) : base(kernel)
    {
        this.kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectDependencyScope(this.kernel.BeginBlock());
    }
}

public class NinjectDependencyScope : IDependencyScope
{
    IResolutionRoot resolver;

    public NinjectDependencyScope(IResolutionRoot resolver)
    {
        this.resolver = resolver;
    }

    public object GetService(System.Type serviceType)
    {
        if (resolver == null)
            throw new ObjectDisposedException("this", "This scope has been disposed");

        var resolved = this.resolver.Get(serviceType);
        return resolved;
    }

    public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType)
    {
        if (resolver == null)
            throw new ObjectDisposedException("this", "This scope has been disposed");

        return this.resolver.GetAll(serviceType);
    }

    public void Dispose()
    {
        IDisposable disposable = resolver as IDisposable;
        if (disposable != null)
            disposable.Dispose();

        resolver = null;
    }
}
公共类NinjectDependencyResolver:NinjectDependencyScope,IDependencyResolver
{
只读IKernel内核;
公共NinjectDependencyResolver(IKernel内核):基本(内核)
{
this.kernel=内核;
}
公共IDependencyScope BeginScope()
{
返回新的NinjectDependencyScope(this.kernel.BeginBlock());
}
}
公共类NinjectDependencyScope:IDependencyScope
{
IResolutionRoot解析器;
公共NinjectDependencyScope(IResolutionRoot解析器)
{
this.resolver=解析器;
}
公共对象GetService(System.Type serviceType)
{
if(解析器==null)
抛出新的ObjectDisposedException(“此”、“此范围已被处置”);
var resolved=this.resolver.Get(serviceType);
返回已解决;
}
public System.Collections.Generic.IEnumerable GetServices(System.Type serviceType)
{
if(解析器==null)
抛出新的ObjectDisposedException(“此”、“此范围已被处置”);
返回this.resolver.GetAll(serviceType);
}
公共空间处置()
{
IDisposable disposable=解析程序为IDisposable;
if(一次性!=null)
一次性的,一次性的;
解析器=空;
}
}
这是我的Ninject.Web.Common.cs

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
        RegisterServices(kernel);

        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind(x =>
            x.FromAssembliesMatching("WebApiTest.DataAccess.dll")
            .SelectAllClasses()
            .BindAllInterfaces()
            .Configure(config => config.InRequestScope()));

        kernel.Bind(x =>
            x.FromAssembliesMatching("WebApiTest.*.dll")
            .SelectAllClasses()
            .BindAllInterfaces()
            .Configure(config => config.InTransientScope()));
    }        
}
公共静态类NinjectWebCommon
{
私有静态只读引导程序Bootstrapper=new Bootstrapper();
/// 
///启动应用程序
/// 
公共静态void Start()
{
RegisterModule(typeof(OnePerRequestHttpModule));
RegisterModule(typeof(NinjectHttpModule));
初始化(CreateKernel);
}
/// 
///停止应用程序。
/// 
公共静态无效停止()
{
bootstrapper.ShutDown();
}
/// 
///创建将管理应用程序的内核。
/// 
///创建的内核。
私有静态IKernel CreateKernel()
{
var kernel=新的标准内核();
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
GlobalConfiguration.Configuration.DependencyResolver=新的NinjectDependencyResolver(内核);
返回内核;
}
/// 
///在这里加载您的模块或注册您的服务!
/// 
///内核。
私有静态无效注册服务(IKernel内核)
{
Bind(x=>
x、 FromAssembliesMatching(“WebApiTest.DataAccess.dll”)
.SelectAllClasses()
.BindAllInterfaces()
.Configure(config=>config.InRequestScope());
Bind(x=>
x、 FromAssembliesMatching(“WebApiTest.*.dll”)
.SelectAllClasses()
.BindAllInterfaces()
.Configure(config=>config.InTransientScope());
}        
}
我的问题是关于NinjectDependencyResolver->BeginScope()方法中的代码:返回新的NinjectDependencyScope(this.kernel.BeginBlock())

我希望我的存储库(在WebApiTest.DataAccess.dll中实现)具有请求范围。我是从内特·科哈里那里找到这个的。我知道这篇文章很旧,但是关于激活块的描述让我怀疑这是否仍然是当前的实现

在Ninject2中,还有最后一种处理作用域的方法,即激活块。块>是覆盖绑定上声明的作用域的一种方式,而不是将>激活的实例与块本身关联

那么,我的存储库的实际范围是什么

另外,我觉得BeginBlock()的使用是可选的,但当我删除它时,对控制器的第一次调用成功,但任何后续调用都会抛出异常:

Ninject组件ICache没有在内核的组件容器中注册这样的组件

为什么???

现在就用这个
这个实现

为了在请求范围中使用依赖项,不要使用Ninject的
InRequestScope()
设置它们,而是使用
GetDependencyScope()将它们从请求中拉出来


我写了一篇关于这一点的博文

我正在使用这些。你到底是什么意思?你不是。看看实现。我们用这条线创造了它们:伊恩,谢谢。没有立即发现您答案中的链接。我的理解正确吗?在我的实现中,BeginBlock()将作用域覆盖为Singleton?创建块将作用域从该块解析到块对象的所有项。如果处置块,则附着的实例将不再绑定。你可以认为他们是单身,当从一个块解决。答案的链接被打破。菲利普,感谢博客文章。非常好。然而,UoW是从控制器中抽象出来的,我不想把上下文一直带下去。有什么想法吗?