介绍
在第一部分我们创建了一个mvc应用程序,并且已经添加了Windsor,但是还没有使用它。为了使用Windsor我们需要在应用程序中添加引用。首先我们来看的是控制器工厂,我们将用它来管理我们的控制器和所有其他的依赖项。
控制器工厂
和其他框架不同,IoC容器就像是一个网络管理员。如果它不出错(前提是你正确的使用),你都不会注意到它。换句话说,我们不会直接的去调用容器也不会和它的API交互,就像你平时根本没注意到你使用了日志处理框架、表现层框架(例如:ASP.NET MVC)或者是持久性框架(例如:NHibernate)。
控制器工厂是处理任何与容器显式交互的地方(除了我们会在Global.asax文件中引导容器)。这的确人很多人感到惊讶并难以致信,如果你也不信,那么请相信我的话的,你会看到它是如何工作,如何利用控制反转(模式)来让这一切成为可能!
控制器工厂是一个底层类,甚至你从来没有在你的代码里调用过。为了显示的调用,我在解决方案里添加了 Plumbing 文件夹,并且在此文件夹里添加了一个WindsorControllerFactory.cs类,这个类继承了MVC的默认控制器工厂类DefaultControllerFactory,并且重写了它的两个方法:
1 using Castle.MicroKernel; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Web; 6 using System.Web.Mvc; 7 using System.Web.Routing; 8 9 namespace WindsorTutorial.Plumbing 10 { 11 public class WindsorControllerFactory : DefaultControllerFactory 12 { 13 private readonly IKernel kernel; 14 public WindsorControllerFactory(IKernel kernel) 15 { 16 this.kernel = kernel; 17 } 18 public override void ReleaseController(IController controller) 19 { 20 kernel.ReleaseComponent(controller); 21 } 22 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 23 { 24 if (controllerType == null) 25 { 26 throw new HttpException(404, string.Format("The controller for path ‘{0}‘ could not be found.", requestContext.HttpContext.Request.Path)); 27 } 28 return (IController)kernel.Resolve(controllerType); 29 } 30 } 31 }
Windsor控制器工厂
控制器工厂有两个职责:1、为mvc运行时提供每一次请求的控制器实力;2、当请求结束后释放控制器。为此我们使用基于Ikernel的Windsor,一个我们使用Windsor为我们处理服务接口,同时在我们使用完毕之后释放他们。
我们使用工厂的基类We leverage the base implementation of the factory to figure out based on the route which controller type should handle the request,在某些情况下,当编译器找不到控制器而报错的时候,我们会返回404错误,同时还会释放控制器。
提示
在这一部分,我们在应用程序中创建了一个控制器工厂利用Windsor来管理组件。在下一部分我们会将它整合到我们的应用程序,将组件管理交给Windsor。