【转】Asp.net MVC 通过自定义ControllerFactory实现构造器注入(重写DefaultControllerFactory)

【转】Asp.net MVC 通过自定义ControllerFactory实现构造器注入

一、重写ControllerFactory的GetControllerInstance

ControllerFactory是asp.net中用于在运行时构造Controller的工厂 ,默认使用的工厂在构造Controller时,默认调用Controller的无参构造函数,所以要实现构造器注入,需要重写工厂中构造Controller的方法GetControllerInstance:

 1 public class CustomControllerFactory : DefaultControllerFactory
 2     {
 3         protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext,Type controllerType)
 4         {
 5             //获取构造函数对象
 6             var constructor = controllerType.GetConstructors()[0];
 7             //获取构造函数参数
 8             var param = constructor.GetParameters();
 9             //获取构造函数所需的参数
10             var paramNames = param.Select(a => {
11                 var serviceType = (ServiceAttribute)(a.ParameterType.GetCustomAttributes(typeof(ServiceAttribute), true)[0]);
12                 var t = Type.GetType(serviceType.ServiceName + ", " + serviceType.ServiceNameSpace, true);
13                 return Activator.CreateInstance(t);
14                 }).ToArray();
15             IController controller = Activator.CreateInstance(controllerType, paramNames) as Controller;
16             return controller;
17         }
18     }

在获取构造函数参数的时候,需要让发射机制寻找到服务的程序集,所以在这个地方我定义了一个名为Service的特性:

 1 public class ServiceAttribute : Attribute
 2     {
 3         private string _serviceName;
 4         private string _serviceNamespace;
 5         public ServiceAttribute(string serviceName, string serviceNamespace)
 6         {
 7             _serviceName = serviceName;
 8             _serviceNamespace = serviceNamespace;
 9         }
10
11         public string ServiceName
12         {
13             get { return _serviceName; }
14         }
15
16         public string ServiceNameSpace
17         {
18             get { return _serviceNamespace; }
19         }
20     }

二、定义服务接口:

1 [Service(serviceName: "InjectController.Service.Impl.AddService", serviceNamespace: "InjectController.Service.Impl")]
2 public interface IAddService
3 {
4     int Add(int a, int b);
5 }

serviceName是服务的全称,serviceNamespace是服务的命名空间。

三、继承服务接口并实现:

1     public class AddService:IAddService
2     {
3         public int Add(int a, int b)
4         {
5             return a + b;
6         }
7     }

四、在Controller中定义构造函数,引用服务接口

 1     public class HomeController : Controller
 2     {
 3         private ILoggerService _loggerService;
 4         private IAddService _addService;
 5         public HomeController(ILoggerService loggerService,IAddService addService)
 6         {
 7             _loggerService = loggerService;
 8             _addService = addService;
 9         }
10
11         public ActionResult Index(int num1, int num2)
12         {
13             _loggerService.Logger(num1.ToString() + "+" + num2.ToString() + "=" + _addService.Add(num1,num2).ToString() + "    " + "\r\n");
14             return View("Index", new LoggerDTO() { LoggerContent = _loggerService.GetLogger() });
15         }
16     }

ILoggerService没有在文章中列出,其格式与IAddService相同。

五、在Global.asax中重新注册控制器工厂,覆盖默认的构造器工厂:

 1     public class MvcApplication : System.Web.HttpApplication
 2     {
 3         protected void Application_Start()
 4         {
 5             AreaRegistration.RegisterAllAreas();
 6             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
 7             RouteConfig.RegisterRoutes(RouteTable.Routes);
 8             BundleConfig.RegisterBundles(BundleTable.Bundles);
 9
10             RegisterCustomControllerFactory();
11         }
12
13         private void RegisterCustomControllerFactory()
14         {
15             IControllerFactory factory = new CustomControllerFactory();
16             ControllerBuilder.Current.SetControllerFactory(factory);
17         }
18     }

运行:发现接口成功的在构造函数中被注入

时间: 2024-10-07 01:24:09

【转】Asp.net MVC 通过自定义ControllerFactory实现构造器注入(重写DefaultControllerFactory)的相关文章

asp.net mvc输出自定义404等错误页面,非302跳转。

朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filters.Add(new HandleErrorAttribute()); 404错误目前想到的解决方法: 先上代码 Global.asax: 1 protected void Application_Error(object sender, EventArgs e) 2 { 3 var ex = Serv

转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链

[译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链 你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求转到ASP.net,然后根据URL,或者更确切来说:被请求文件的扩展名.在IIS

转载:ASP.NET MVC扩展自定义视图引擎支持多模板&动态换肤skins机制

ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的项目支持多模板&skins机制,比如我们可能会有多套的模板,也就是多个View风格,而我们只需要改一下配置文件就可以轻松的改变页面的风格和模板.实现这个功能有两种方式: 一.使用接口IViewEngine自己完成一个类似Razor视图引擎的功能. 二.继承类RazorViewEngine类,重写它的一些方

asp.net MVC之 自定义过滤器(Filter) - shuaixf

一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以秒为单位 ,理论上缓存时间可以很长,但实际上当系统资源紧张时,缓存空间还是会被系统收回. VaryByParam :以哪个字段为标识来缓存数据,比如当"ID"字段变化时,需要改变缓存(仍可保留原来的缓存),那么应该设VaryByParam为"ID".这里你可以设置以下几

ASP.NET MVC 的自定义模型绑定

最近在研究 ASP.NET MVC 模型绑定,发现 DefaultModelBinder 有一个弊端,就是无法实现对浏览器请求参数的自定义,最初的想法是想为实体模型的属性设置特性(Attribute),然后通过取得设置的特性值对属性进行赋值,研究了好久 MVC 源码之后发现可以通过重写 DefaultModelBinder 的 BindProperty 方法可以达到预期的目的. ASP.NET MVC 中有一个自定义模型绑定特性 CustomModelBinderAttribute,打算通过重写

ASP.NET MVC下自定义错误页和展示错误页的几种方式

在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是网站所依赖的宿主抛出的,一般来讲我们所依赖的宿主就是IIS了. IIS中的错误页入口: 其中的错误码想必并不陌生 这里是在服务器上找不到所需资源时抛出的错误页,在这里可以设置需要展示的错误页面,只需将预定的错误页面加入服务器中,然后在指定状态码下配置路径即可. 这是请求在IIS中时,还未完全进入到a

[转]ASP.net MVC 2 自定义模板来显示数据

本文转自:http://blog.163.com/[email protected]/blog/static/1394892972012113104653651/ 在ASP.net MVC 2中,一个很有意思,也很实用的功能,就是可以模板化地显示数据模型.什么叫模板化地显示数据模型呢?MVC可以指定某种数据类型在视图中呈现时,以何种形式来进行呈现.一般情况下,MVC框架会将模型中和各个字段以字符串的形式进行渲染,所以,我们看到的就是字符串.然而,我们有了模板化帮助器,我们可以更加自由地来装饰我们

asp.net mvc输出自定义404等错误页面,非302跳转

朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filters.Add(new HandleErrorAttribute()); 404错误目前想到的解决方法: 先上代码 Global.asax: 1 protected void Application_Error(object sender, EventArgs e) 2 { 3 var ex = Serv

ASP.NET MVC 之自定义HtmlHelper

前言 HtmlHelper方法为我们提供很多html标签,只需在页面调用就行了,但是微软并没有把所有的html标签都对应有了扩展方法,需要我们重新自定义Htmlper,来满足我们需要. 方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace TestMvcHelper { public static class H