- 浏览: 114691 次
- 来自: ...
文章分类
最新评论
-
Juanjuel:
Django多表查询 -
chenokia:
那么在\grails-app\conf 下的DataSourc ...
Grails如何使用外部配置文件 -
viking2439:
有没有方法去指定用户去获得某个权限呢?
[django]总结Django中的用户权限模块
我们知道在我们使用Castle IOC的时候,若你的类库在容器中的时候,你只需要通过公开属性或构造时设置参数后,Castle容器就会自动的根据配置文件中的服务为您实例化相应的类。但他并不支持Asp.Net的后置代码类。那么在Asp.Net中应如何获取容器中的服务呢?
我们可以通过如下方式:
我曾通过这个方式写了一个页面基类,页面继承该类后,就可以通过公开属性的方式来得到服务。
你也可以看 自由、创新、研究、探索…… 的博客上也有相应的介绍:在asp.net页面上得到Castle容器的实例 。
这是我以前的做法,今天所要讲的是另一种使用方式,通过HttpHandler的方式将每个页面的HttpHandler增加到Castle容器中。(以下代码来自互联网)
这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。
我们可以通过如下方式:
IWindsorContainer container = ContainerAccessorUtil.GetContainer();
UserManage um = (UserManage)container["usermanage"];
其中usermanage就是配置文件中的component的ID.UserManage um = (UserManage)container["usermanage"];
我曾通过这个方式写了一个页面基类,页面继承该类后,就可以通过公开属性的方式来得到服务。
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;
}
= 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);
}
}
}
{
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);
}
}
}
这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。
发表评论
-
IBatisNet系列-介绍篇
2006-03-25 14:56 1026IBatisNET从名字就可以看出,他是从Java的IBati ... -
IBatisNet系列二-QuickStart篇
2006-03-25 14:59 974本节我参考官方网站上的Quick Start Guide,网址 ... -
IBatisNet系列-执行存储过程
2006-03-25 15:24 1172映射xml文件书写如下 <?xml version=& ... -
IBatis.Net系列-Mapped Statements的语法
2006-03-29 15:25 888语法:<statement id="state ... -
Castle- Startable Facility 简单理解
2006-03-30 17:56 877最近在研究Castle开源项目,就下午学习Startable ... -
IBatis.Net系列-多参数的SQL语句的配置
2006-04-15 12:15 1454由于本人对IBatis.Net的并不是很精通,也是在边学边工作 ... -
MonoRail学习-介绍篇
2006-04-24 10:22 752刚刚结束了使用Castle MonoRail的一个项目,所以想 ... -
MonoRail学习-入门实例篇
2006-04-24 11:51 1333MonoRail学习目录实例代码下载:/Files/maply ... -
MonoRails学习- Layouts
2006-04-24 12:14 832MonoRail学习目录实例代码:/Files/maplye/ ... -
MonoRail学习-Component
2006-04-24 13:30 741MonoRail学习目录在我们asp.net中,经常有界面代码 ... -
Which Style of Workflow When?[转]
2006-05-24 16:58 756http://blogs.msdn.com/davegreen ... -
WF in Asp.Net
2006-05-26 11:19 968这几天在研究Windows Workflow Foundati ... -
WF学习-Console Workflow Application
2006-05-26 16:51 932环境必备:.NET Framework 2.0VS.Net 2 ... -
WF学习-WorkFLow中的参数
2006-05-27 15:46 1164系统和WorkFlow交互有很多种方式,今天介绍的是通过Wor ... -
Castle ActiveRecord.chm
2006-05-31 18:06 758收集 TerryLee's Tech Space 和 SHY5 ... -
使用UserControl时,在Page中定义方式
2006-06-24 10:02 910我们通常,会将一些通用的页面模块作成用户控件,然后加载到页面中 ... -
ASP.Net2.0中自定义控件在page中的注册
2006-06-24 14:15 815今天在网上看到ASP.Net 2.0中注册自定义控件的好方法, ... -
Asp.Net中NHiernate的Session的管理
2006-06-26 11:08 674NHibernate中的Session,在我的理解似乎就相当于 ... -
GridView使用一些记录
2006-06-30 10:45 972现在有个项目开始使用ASP.NET 2.0开发,在开发过程中关 ... -
NHiernate中自定义Generator
2006-07-04 13:50 936我的这个自定义的Generator设置如下: <g ...
相关推荐
在ASP.NET MVC中,Castle Windsor作为依赖注入容器,可以方便地管理对象的生命周期,实现组件间的解耦,使得代码更加灵活和易于测试。 在提供的压缩包中,"贴吧(定稿).rar"可能包含了项目的最终源代码,包括ASP...
在ASP.NET MVC2.0中,Castle Windsor可以帮助管理对象的生命周期,提供服务定位和解耦,使得应用程序更易于测试和扩展。它可以自动注入依赖,减少硬编码的依赖关系,提高代码的灵活性。 在这个Demo中,开发者可能...
ASP.NET MVC2是微软开发的一款基于模型-视图-控制器(Model-View-Controller)设计模式的Web应用程序框架。这个框架允许开发者通过分离关注点来构建可维护性和可测试性的应用,提供了对HTTP请求处理的强大控制,以及...
在这个基于ASP.NET的图书管理系统中,开发者利用了Castle项目,这是一个开源的.NET框架,它提供了一种轻量级的依赖注入容器,有助于实现面向接口编程和松耦合的设计。 图书管理系统是信息化管理的重要组成部分,它...
ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和高效的性能。而NBear则是.NET平台上的一款优秀的开源对象关系映射(ORM)框架,它的全称为Non-Block Entity Access Repository,由陈宝权...
【IBatisNet+Castle项目实例】是一个基于ASP.NET框架的集成解决方案,它结合了两个强大的开源库:IBatisNet和Castle。IBatisNet是.NET平台上的一个轻量级持久层框架,而Castle则是.NET开发中的一个全面的工具集,...
- **路由机制**:介绍ASP.NET MVC3中的路由机制,包括默认路由规则和自定义路由规则的设置方法。 #### 四、视图篇:构建动态用户界面 - **视图引擎**:介绍ASP.NET MVC3支持的视图引擎(如Razor),并展示如何利用...
ASP.NET是微软公司推出的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了丰富的功能和工具,简化了Web应用的开发流程。这个压缩包文件"ASP.NET学习积累的代码—太多了够你学的了"显然是一个...
4. **Castle MonoRail**:虽然不在当前压缩包内,但值得提及的是,Castle MonoRail是一个Web MVC框架,它为.NET开发者提供了一种替代ASP.NET的轻量级、灵活的开发方式,强调了强类型和约定优于配置的原则。...
Castle项目是一个开源的.NET框架集合,它包含多个组件,如Castle Windsor——一个强大的依赖注入容器,Castle ActiveRecord——提供对象关系映射(ORM)功能,以及Castle MonoRail——一个用于ASP.NET的轻量级MVC...
- **依赖注入容器**:探讨常用的依赖注入容器(如Unity、Castle Windsor),以及如何将它们集成到ASP.NET MVC项目中。 #### 13. 单元测试 (Unit Testing) - **单元测试基础**:介绍单元测试的基本概念及其在软件...
在这一章节中,作者介绍了ASP.NET MVC 3的基本概念和发展背景,并指导读者如何搭建开发环境,包括安装必要的软件和工具,如Visual Studio、ASP.NET MVC 3框架等。此外,还会涉及到一个简单的“Hello World”应用程序...
4. **Castle MonoRail**:这是一个轻量级的MVC(模型-视图-控制器)Web应用框架,提供了一种更简洁、更可测试的替代ASP.NET Web Forms的方式。MonoRail强调强类型、约定优于配置以及面向行为的编程。 关于"Castle...
1. **MVC应用开发**: Castle框架可以很好地与ASP.NET MVC集成,通过Windsor容器管理控制器和服务,实现依赖注入,提高代码的可测试性和可维护性。 2. **微服务架构**: 由于其轻量级的特性,Castle框架适合构建微...
ActiveRecord 是 Castle 中的一个重要组件,它对当前热门的 ORM 框架 NHibernate 进行了封装处理,主要包括将一些常用的数据进行抽象化、通过 Attribute 来取代 mapping 文件等。在 ActiveRecord 的实现中,Model ...
3. **Castle MonoRail**:这是一款Web应用框架,与ASP.NET MVC类似,但更注重于MVC模式的实现。MonoRail强调控制器的职责分离,提供视图助手和动作过滤器等功能,简化Web应用的开发。尽管在描述中提到Castle....
《asp.net设计模式》涵盖了开发企业级asp.net应用程序的知名模式和最佳实践。本书用到的模式可以用于从asp.net1.0到asp.net 4.0的任何版本。不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。 ...
Castle项目是一个开源.NET框架,它提供了一系列强大的工具和库,如依赖注入容器、动态代理、以及ASP.NET MVC的实现等。本文将聚焦于 Castle-2.5 版本的源码,探讨其中的关键技术和设计理念。 一、依赖注入(DI)与...