`
maplye
  • 浏览: 114688 次
  • 来自: ...
社区版块
存档分类
最新评论

[Castle]Asp.Net中获取Castle容器中的服务的另一方法

    博客分类:
  • .NET
阅读更多
我们知道在我们使用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);
            }

        }

    }

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



分享到:
评论

相关推荐

    asp.net mvc2.0+前台Jquery+IbatisNet+Castle

    在ASP.NET MVC中,Castle Windsor作为依赖注入容器,可以方便地管理对象的生命周期,实现组件间的解耦,使得代码更加灵活和易于测试。 在提供的压缩包中,"贴吧(定稿).rar"可能包含了项目的最终源代码,包括ASP...

    asp.net mvc2.0 Jquery IbatisNet Castle

    在ASP.NET MVC2.0中,Castle Windsor可以帮助管理对象的生命周期,提供服务定位和解耦,使得应用程序更易于测试和扩展。它可以自动注入依赖,减少硬编码的依赖关系,提高代码的灵活性。 在这个Demo中,开发者可能...

    asp.net mvc2

    ASP.NET MVC2是微软开发的一款基于模型-视图-控制器(Model-View-Controller)设计模式的Web应用程序框架。这个框架允许开发者通过分离关注点来构建可维护性和可测试性的应用,提供了对HTTP请求处理的强大控制,以及...

    基于asp.net的图书管理系统设计实现

    在这个基于ASP.NET的图书管理系统中,开发者利用了Castle项目,这是一个开源的.NET框架,它提供了一种轻量级的依赖注入容器,有助于实现面向接口编程和松耦合的设计。 图书管理系统是信息化管理的重要组成部分,它...

    asp.net 优秀框架NBearV3.5.6_binary

    ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和高效的性能。而NBear则是.NET平台上的一款优秀的开源对象关系映射(ORM)框架,它的全称为Non-Block Entity Access Repository,由陈宝权...

    IBatisNet+Castle项目实例

    【IBatisNet+Castle项目实例】是一个基于ASP.NET框架的集成解决方案,它结合了两个强大的开源库:IBatisNet和Castle。IBatisNet是.NET平台上的一个轻量级持久层框架,而Castle则是.NET开发中的一个全面的工具集,...

    Professional ASP.NET MVC3

    - **路由机制**:介绍ASP.NET MVC3中的路由机制,包括默认路由规则和自定义路由规则的设置方法。 #### 四、视图篇:构建动态用户界面 - **视图引擎**:介绍ASP.NET MVC3支持的视图引擎(如Razor),并展示如何利用...

    ASP.NET学习积累的代码—太多了够你学的了

    ASP.NET是微软公司推出的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了丰富的功能和工具,简化了Web应用的开发流程。这个压缩包文件"ASP.NET学习积累的代码—太多了够你学的了"显然是一个...

    Castle-bin-net-2.0.rar

    4. **Castle MonoRail**:虽然不在当前压缩包内,但值得提及的是,Castle MonoRail是一个Web MVC框架,它为.NET开发者提供了一种替代ASP.NET的轻量级、灵活的开发方式,强调了强类型和约定优于配置的原则。...

    Castle3.0卷3

    Castle项目是一个开源的.NET框架集合,它包含多个组件,如Castle Windsor——一个强大的依赖注入容器,Castle ActiveRecord——提供对象关系映射(ORM)功能,以及Castle MonoRail——一个用于ASP.NET的轻量级MVC...

    [Wrox] Professional ASP.NET MVC 4 英文原版

    - **依赖注入容器**:探讨常用的依赖注入容器(如Unity、Castle Windsor),以及如何将它们集成到ASP.NET MVC项目中。 #### 13. 单元测试 (Unit Testing) - **单元测试基础**:介绍单元测试的基本概念及其在软件...

    MVC学习之——Professional ASP.NET MVC 3

    在这一章节中,作者介绍了ASP.NET MVC 3的基本概念和发展背景,并指导读者如何搭建开发环境,包括安装必要的软件和工具,如Visual Studio、ASP.NET MVC 3框架等。此外,还会涉及到一个简单的“Hello World”应用程序...

    Castle官方下载

    4. **Castle MonoRail**:这是一个轻量级的MVC(模型-视图-控制器)Web应用框架,提供了一种更简洁、更可测试的替代ASP.NET Web Forms的方式。MonoRail强调强类型、约定优于配置以及面向行为的编程。 关于"Castle...

    Castle框架

    1. **MVC应用开发**: Castle框架可以很好地与ASP.NET MVC集成,通过Windsor容器管理控制器和服务,实现依赖注入,提高代码的可测试性和可维护性。 2. **微服务架构**: 由于其轻量级的特性,Castle框架适合构建微...

    VS.NET开源框架

    ActiveRecord 是 Castle 中的一个重要组件,它对当前热门的 ORM 框架 NHibernate 进行了封装处理,主要包括将一些常用的数据进行抽象化、通过 Attribute 来取代 mapping 文件等。在 ActiveRecord 的实现中,Model ...

    Castle 源码 源代码

    3. **Castle MonoRail**:这是一款Web应用框架,与ASP.NET MVC类似,但更注重于MVC模式的实现。MonoRail强调控制器的职责分离,提供视图助手和动作过滤器等功能,简化Web应用的开发。尽管在描述中提到Castle....

    ASP.NET设计模式-杨明军译(源码)

    《asp.net设计模式》涵盖了开发企业级asp.net应用程序的知名模式和最佳实践。本书用到的模式可以用于从asp.net1.0到asp.net 4.0的任何版本。不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。  ...

    Castle-2.5源码

    Castle项目是一个开源.NET框架,它提供了一系列强大的工具和库,如依赖注入容器、动态代理、以及ASP.NET MVC的实现等。本文将聚焦于 Castle-2.5 版本的源码,探讨其中的关键技术和设计理念。 一、依赖注入(DI)与...

Global site tag (gtag.js) - Google Analytics