Asp.net web api Ninject 3-BeginBlock()是否覆盖asp.net WebAPI中的InRequestScope?
我的asp.net WebApi项目包含多个用于服务、核心和数据访问的程序集。为了在项目中使用Ninject作为我的DI容器,我从NuGet添加了Ninject.Web.Common包。然后,我将IDependencyResolver实现为: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
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是从控制器中抽象出来的,我不想把上下文一直带下去。有什么想法吗?