[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#region IHttpHandler Members

        
/**//// <summary>
        
/// Process the aspx request. This means (eventually) rewriting the url and registering the page 
        
/// in the container.
        
/// </summary>
        
/// <param name="context"></param>

        public void ProcessRequest(HttpContext context)
        
{
            
string rawUrl = context.Request.RawUrl;
            log.Info(
"Starting request for " + rawUrl);
            DateTime startTime 
= DateTime.Now;

            
// Rewrite url
            
//UrlRewriter urlRewriter = new UrlRewriter(context);
            
//string rewrittenUrl = urlRewriter.RewriteUrl(rawUrl);

            
// Obtain the handler for the current page
            string aspxPagePath = rawUrl.Substring(0, rawUrl.IndexOf(".aspx"+ 5);
            IHttpHandler handler 
= PageParser.GetCompiledPageInstance(aspxPagePath, null, context);

            
// Register the page in the container
            handler = RegisterAspxPage(handler, context);

            
// Process the page just like any other aspx page
            handler.ProcessRequest(context);

            
// Remove the page from the container
            RemoveAspxPage(handler, context);

            
// Log duration
            TimeSpan duration = DateTime.Now - startTime;
            log.Info(String.Format(
"Request finshed. Total duration: {0} ms.", duration.Milliseconds));
        }


        
/**//// <summary>
        
/// 
        
/// </summary>

        public bool IsReusable
        
{
            
get return true; }
        }


        
#endregion


        
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);
            }

        }

    }

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



你可能感兴趣的:(.net,互联网,IOC,asp.net,asp)