【IT168技术文档】
第一个MonoRail程序中并没有使用到Castle的容器功能。使用Castle容器则要求将控制器(controllers), 过滤器(filters)和 ViewComponents 都注册到Castle容器中,同时使你的设计保持一种松耦合状态。
如果您想要在自己所定义的组件使用Castle的容器功能。则只需要在配置上设置属性useWindsorIntegration, web应用程序中可以访问到Castle容器。 Web.config配置如下:
自定义HttpApplication,实现Castle.Windsor.IContainerAccessor接口。<?xml version="1.0"?> <configuration> <configSections> <section name="monoRail" type="Castle.MonoRail.Framework.Configuration.MonoRailSectionHandler, Castle.MonoRail.Framework"/> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> </configSections> <monoRail useWindsorIntegration="true"> <viewEngine viewPathRoot="Views" customEngine="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity"/> </monoRail> <system.web> <httpHandlers> <!--定义httpHandler, 让MonoRailHttpHandlerFactory接管指定扩展名的url--> <add verb="*" path="*.rails" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework"/> <!-- 阻止模板文件被下载 --> <add verb="*" path="*.vm" type="System.Web.HttpForbiddenHandler"/> </httpHandlers> <httpModules> <add name="monorail" type="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework" /> </httpModules> <compilation debug="true"> <assemblies> <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies></compilation> </system.web> <castle> <!-- component and facilities configuration goes here --> </castle> </configuration>
GlobalApplication.cs
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using Castle.Windsor; namespace MonoRailWithIoCWeb { /// /// Summary description for MyGlobalApplication /// public class MyGlobalApplication : HttpApplication, IContainerAccessor { private static WebAppContainer container; public void Application_OnStart() { container = new WebAppContainer(); } public void Application_OnEnd() { container.Dispose(); } public IWindsorContainer Container { get { return container; } } } }