首页 > 代码库 > IOC容器特性注入第七篇:请求上下文作用域
IOC容器特性注入第七篇:请求上下文作用域
Ninject的对象作用域:
Transient | .InTransientScope() | 每次调用创建新实例。 |
Singleton | .InSingletonScope() | 单例,仅创建一个实例。 |
Thread | .InThreadScope() | 每一个线程创建一个实例。 |
Request | .InRequestScope() | 每当Web请求发起时创建一个实例,结束请求时释放实例 |
由于我们使用的web开发,所以一般都是InReuqestScope()的作用域,Kooboo对Ninject的作用域没有用,而是用自己了的扩展类,再注册httpModule
1.OnePerRequestHttpModule(IhttpModule扩展类,每次http请求结束从Ninject的缓存清空实例):
public sealed class OnePerRequestHttpModule : GlobalKernelRegistration, IHttpModule { public OnePerRequestHttpModule() { this.ReleaseScopeAtRequestEnd = true; } /// <summary> /// 把当前实例从HTTP上下文给清空 只保存HTTP请求作用域 /// </summary> public void DeactivateInstancesForCurrentHttpRequest() { if (this.ReleaseScopeAtRequestEnd) { HttpContext context = HttpContext.Current; base.MapKernels((IKernel kernel)=>{ kernel.Components.Get<ICache>().Clear(context); }); } } public void Dispose() { } public void Init(HttpApplication application) { application.EndRequest += (object o, EventArgs e)=> { this.DeactivateInstancesForCurrentHttpRequest(); }; } public bool ReleaseScopeAtRequestEnd { get; set; } }
2.NinjectWebCommonStartupTask(注册类)
//把请求周期注册到模块中 [assembly: System.Web.PreApplicationStartMethod(typeof(DaHua.Common.Runtime.Dependency.Ninject.NinjectWebCommonStartupTask), "Start")] namespace DaHua.Common.Runtime.Dependency.Ninject { public static class NinjectWebCommonStartupTask { public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); } } }
这2个类,就可以把IOC容器的每次请求的实例 只在Http请求的周期内,http结束就失效。保证每个实例的对象作用域只能在http请求范围内
源代码下载:
Ninject.Ioc.Core.zip
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。