zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    java获取指定文件夹下的所有文件名
    org.dom4j.DocumentException: unknown protocol: d Nested exception: unknown
    如何在spring中获取request对象
    Java获取文件后缀名
    解析XML并将信息封装到对象中
    在web项目启动时执行某个方法
    Maven Dependencies没有了的解决办法
    B-树(B+树) 学习总结
    Netty学习笔记之一(Netty解析简单的Http Post Json 请求)
    用到的设计模式总结--单例模式+工厂方法模式+Builder模式
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/3783679.html
Copyright © 2011-2022 走看看