(译)Windsor入门教程---第二部分 引用Windsor

原文:http://docs.castleproject.org/Windsor.Windsor-tutorial-ASP-NET-MVC-3-application-To-be-Seen.ashx

介绍

    在第一部分我们创建了一个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 namespace WindsorTutorial.Plumbing
 9 {
10     public class WindsorControllerFactory : DefaultControllerFactory
11     {
12         private readonly IKernel kernel;
13         public WindsorControllerFactory(IKernel kernel)
14         {
15             this.kernel = kernel;
16         }
17         public override void ReleaseController(IController controller)
18         {
19             kernel.ReleaseComponent(controller);
20         }
21         protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
22         {
23             if (controllerType == null)
24             {
25                 throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
26             }
27             return (IController)kernel.Resolve(controllerType);
28         }
29     }
30 }                                 

 

 

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。

posted @ 2014-05-25 23:59  许全通  阅读(524)  评论(0编辑  收藏  举报