介绍
在第一部分我们创建了一个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。