博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOC容器特性注入第七篇:请求上下文作用域
阅读量:7031 次
发布时间:2019-06-28

本文共 1735 字,大约阅读时间需要 5 分钟。

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;        }        ///         /// 把当前实例从HTTP上下文给清空 只保存HTTP请求作用域        ///         public void DeactivateInstancesForCurrentHttpRequest() {            if (this.ReleaseScopeAtRequestEnd) {                HttpContext context = HttpContext.Current;                base.MapKernels((IKernel kernel)=>{                    kernel.Components.Get
().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请求范围内

 源代码下载:

转载地址:http://lwyal.baihongyu.com/

你可能感兴趣的文章