zoukankan      html  css  js  c++  java
  • [Castle]Asp.Net中获取Castle容器中的服务的另一方法

    我们知道在我们使用Castle IOC的时候,若你的类库在容器中的时候,你只需要通过公开属性或构造时设置参数后,Castle容器就会自动的根据配置文件中的服务为您实例化相应的类。但他并不支持Asp.Net的后置代码类。那么在Asp.Net中应如何获取容器中的服务呢?
    我们可以通过如下方式:
    IWindsorContainer container = ContainerAccessorUtil.GetContainer();
    UserManage um 
    = (UserManage)container["usermanage"];
    其中usermanage就是配置文件中的component的ID.
    我曾通过这个方式写了一个页面基类,页面继承该类后,就可以通过公开属性的方式来得到服务。
    private BindingFlags BINDING_FLAGS_SET
                
    = BindingFlags.Public
                
    | BindingFlags.SetProperty
                
    | BindingFlags.Instance
                
    | BindingFlags.SetField
                ;


            
    protected override void OnInit(EventArgs e)
            
    {
                
    //判断退出
                if (IsCheckLogin== true && this.UserId == -1)
                
    {
                    Response.Redirect(
    "~/index.aspx");
                }


                IWindsorContainer container 
    = ObtainContainer();

                Type type 
    = this.GetType();

                PropertyInfo[] properties 
    = type.GetProperties(BINDING_FLAGS_SET);

                
    foreach (PropertyInfo propertie in properties)
                
    {
                    
    string pname = propertie.Name;

                    
    if (container.Kernel.HasComponent(pname))
                    
    {

                        propertie.SetValue(
    this, container[pname], null);
                    }

                }

                
    base.OnInit(e);
            }




            
    public IWindsorContainer ObtainContainer()
            
    {

                IContainerAccessor containerAccessor 
    =

                     HttpContext.Current.ApplicationInstance 
    as IContainerAccessor;
                
    if (containerAccessor == null)
                
    {
                    
    throw new ApplicationException("你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性");
                }


                IWindsorContainer container 
    = containerAccessor.Container;
                
    if (container == null)
                
    {
                    
    throw new ApplicationException("HttpApplication 得不到容器的实例");
                }

                
    return container;

            }

    你也可以看 自由、创新、研究、探索…… 的博客上也有相应的介绍:在asp.net页面上得到Castle容器的实例

    这是我以前的做法,今天所要讲的是另一种使用方式,通过HttpHandler的方式将每个页面的HttpHandler增加到Castle容器中。(以下代码来自互联网)
    public class PageHandler : IHttpHandler, IRequiresSessionState
        
    {
            
    private static readonly ILog log = LogManager.GetLogger(typeof(PageHandler));

            
    IHttpHandler Members

            
    private IHttpHandler RegisterAspxPage(IHttpHandler handler, HttpContext context)
            
    {
                
    if (handler is IRuixinPage)
                
    {
                    
    string pageKey = Guid.NewGuid().ToString();
                    IWindsorContainer container 
    = ContainerAccessorUtil.GetContainer();
                    container.Kernel.AddComponent(pageKey, handler.GetType());

                    
    if (container.Kernel.HasComponent(handler.GetType()))
                    
    {
                        IHttpHandler newHandler 
    = (IHttpHandler)container[handler.GetType()];
                        handler 
    = newHandler;
                    }

                }

                
    return handler;
            }


            
    private void RemoveAspxPage(IHttpHandler handler, HttpContext context)
            
    {
                
    if (handler is IRuixinPage)
                
    {
                    IWindsorContainer container 
    = (context.ApplicationInstance as IContainerAccessor).Container;
                    container.Release(handler);
                }

            }

        }

    这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。



  • 相关阅读:
    day113-django-Form组件常用字段和参数
    day112-django-Form组件-ajax提交给后台的Form验证
    day110-django-中间件和(socket:wsgiref、uwsgi)
    day111-django-初识Form组件(验证登录信息)
    day109-django-多对多、session保存用户信息到数据库和从数据库获取用户信息
    day108-django-路由分发、动态路由、伪静态、根据名称反向生成url
    软件测试基础
    Python并发编程之:多进程
    进程介绍(理论部分)
    网络编程
  • 原文地址:https://www.cnblogs.com/maplye/p/588938.html
Copyright © 2011-2022 走看看