【转】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 ServiceName12 ????????{13 ????????????get { return _serviceName; }14 ????????}15 16 ????????public string ServiceNameSpace17 ????????{18 ????????????get { return _serviceNamespace; }19 ????????}20 ????}
二、定义服务接口:
1 [Service(serviceName: "InjectController.Service.Impl.AddService", serviceNamespace: "InjectController.Service.Impl")]2 public interface IAddService3 {4 ????int Add(int a, int b);5 }
serviceName是服务的全称,serviceNamespace是服务的命名空间。
三、继承服务接口并实现:
1 ????public class AddService:IAddService2 ????{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 ????}
运行:发现接口成功的在构造函数中被注入
【转】Asp.net MVC 通过自定义ControllerFactory实现构造器注入(重写DefaultControllerFactory)
原文地址:http://www.cnblogs.com/xdot/p/7799410.html
知识推荐
- 基于Quartz.Net的任务管理平台开发(3) —— 任务管理平台
- KendoUI AngularJS Bootstrap
- skynet 报错 skynet 服务缺陷 Lua死循环
- phpExcel大数据量情况下内存溢出解决
- Web前端 (第一阶段)
- https部署实践 (Let's Encrypt)
- 从ranknet到lamdarank,再到lamdamart
- js获取前几天的时间及时间区间
- 两种 AuthorizationSchemes 在 ASP.NET Core 2
- web前端名词
- IE浏览器上传图片预览兼容(IE 7 8 9 10 11)
- 常用HTTP消息头
- web框架---Django之MTV模型
- 三、VueJs 填坑日记之项目文件认识
- ASP.NET没有魔法——ASP.NET MVC 直连路由(特性路由)
- JS判断字符串中是否包含特定的字符串
- svg param.js的大bug
- phpcms实现全站搜索