Global using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.SessionState; using Castle.Windsor; using Castle.Core.Resource; using Castle.Windsor.Configuration.Interpreters; namespace FES.Web { publicclass Global : System.Web.HttpApplication, IContainerAccessor { privatestatic WindsorContainer container; protectedvoid Application_Start(object sender, EventArgs e) { container =new WindsorContainer(new XmlInterpreter(new ConfigResource())); } protectedvoid Application_End(object sender, EventArgs e) { } IContainerAccessor Members#region IContainerAccessor Members public IWindsorContainer Container { get{ return container; } } #endregion } }
这样我们的配置才算完成,然后可以在代码中使用这些组件了。
四、将asp.net页面加入到Castle容器中
using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.Security; using System.Reflection; using System.Data; using System.Configuration; using Castle.Core; using Castle.Windsor; using Castle.Windsor.Configuration.Interpreters; namespace FES.Component { /**////<summary> /// 为将ASP.NET页面添加到Castle容器中而建立的类,所有页面必须继承此类 ///</summary> publicclass PageBase : System.Web.UI.Page { protected BindingFlags BINDING_FLAGS_SET = BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.SetField ; protectedoverridevoid OnInit(EventArgs e) { 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) { thrownew ApplicationException("你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性"); } IWindsorContainer container = containerAccessor.Container; if (container ==null) { thrownew ApplicationException("HttpApplication 得不到容器的实例"); } return container; } } }