在asp.net页面上得到Castle容器的实例

在项目中使用Castle IOC容器,Asp.net程序中如何得到Castle容器内。

可以如下实现:

1、Gloabal实现接口IContainerAccessor

public class Global : System.Web.HttpApplication, IContainerAccessor
  {
 /// <summary>
 /// 必需的设计器变量。
 /// </summary>
  private System.ComponentModel.IContainer components = null;
  private static WindsorContainer container;
 
         public Global()
 {
  InitializeComponent();
 } 
 protected void Application_Start(Object sender, EventArgs e)
 {
  container = new MyContainer(new XmlInterpreter("app_config.xml"));
 } 
  protected void Session_Start(Object sender, EventArgs e)
 {
 }
……
 protected void Application_End(Object sender, EventArgs e)
 {
  container.Dispose();
 } 
  #region IContainerAccessor implementation
 public IWindsorContainer Container
 {
  get { return container; }
 }
  
}

2、使用如下类来获取容器实例,这段代码来自Castle.MVC

 /// <summary>
 /// Uses the HttpContext and the <see cref="IContainerAccessor"/> 
 /// to access the container instance.
 /// </summary>
 public abstract class ContainerWebAccessorUtil
 {
 /// <summary>
 /// 从application中获取一个容器实例
 /// </summary>
 /// <returns>返回一个 IWindsorContainer</returns>
 public static 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;
 }
 } 

3、在具体的用户控件,页面的后置代码中通过ContainerWebAccessorUtil. ObtainContainer()获取容器实例。当然如果使用Castle.MVC,MVC框架也是这样用的,自己就不要这么麻烦了,可以将这个写在页面和控件的基类中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏飞扬的花生

Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求。 在winform上面实现excel操作:ht...

48410
来自专栏算法修养

PAT 甲级 1019 General Palindromic Number(简单题)

1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制...

34510
来自专栏hbbliyong

母版页

1. 在整个站点中应用母版页 <configuration> <system.web> <pages masterPageFile="~/Site...

3194
来自专栏一个爱瞎折腾的程序猿

mvc一对多模型表单的快速构建

Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单。如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?...

3022
来自专栏ZKEASOFT

.Net Core在Middleware中解析RouteData

在ASP.Net Core中,如果直接在Middleware中获取RouteData返回的是空值,这是因为RouterMiddleware还没执行。但有些情况下...

1913
来自专栏张善友的专栏

自定义Unity对象生命周期管理集成ADO.NET Entity Framework

在Unity中,从Unity 取得的实例为 Transient。如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一...

3558
来自专栏木宛城主

SharePoint中在线编辑文档

我一直以为只有在Document Library里面的File才会支持在线编辑。直到今天早上我才发现用IE打开List里面的Attachments也是支持在线...

3676
来自专栏飞扬的花生

Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求。 在winform上面实现excel操作:ht...

5075
来自专栏知识分享

9-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,C#TCP客户端发信息给单片机控制小灯的亮灭)

http://www.cnblogs.com/yangfengwu/p/8780182.html 自己都是现做现写,如果想知道最终实现的功能,请看最后 先把源...

5894
来自专栏一个爱瞎折腾的程序猿

mvc网站迁移.net core记录

ConfigureServices方法中配置即可,详情见院长文章 http://www.cnblogs.com/dudu/p/5879913.html

1671

扫码关注云+社区

领取腾讯云代金券