使用Unity在MVC上实现动态注入
一、前言
通过前一篇的文章介绍使用unity轻量级的依赖注入容器,本文就介绍在MVC上使用unity依赖注入控制器和控制器中的日志属性。
实现MVC中新提供 的两个接口:IDependencyResolver和 IControllerActivator
二、代码实现
自定义创建CustomControllerActivator类实现IControllerActivator接口的方法
   public class CustomControllerActivator : IControllerActivator
    {
        IController IControllerActivator.Create( System.Web.Routing.RequestContext requestContext,  Type controllerType)
        {
            return DependencyResolver.Current.GetService(controllerType) as IController;   //从容器中创建的HomeController转换成 IController
        }
    }
还要创建一个UnityDependencyResolver类实现IDependencyResolver接口的GetService和GetServices方法
 public class UnityDependencyResolver : IDependencyResolver
    {
        IUnityContainer container;
        public UnityDependencyResolver(IUnityContainer container)
        {
            this.container = container;
        }
        public object GetService(Type serviceType)
        {
            try
            { //启动HomeController 控制器,就会创建HomeController,//而且HomeController里面有个public ILogger Logger { get; set; }日志属性,上面打了 [Dependency]特性,//并且GetUnityContainer()方法里面也已经给日志属性注册了FlatFileLogger了,所以默认创建HomeController的时候,也给日志属性注入FlatFileLogger
                return container.Resolve(serviceType);
            }
            catch
            {
                return null;
            }
        }
        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return container.ResolveAll(serviceType);
            }
            catch
            {
                return new List<object>();
            }
        }
    }
定义好这两个类,我们找到Global.asax.cs,并在其中中添加一个私有方法GetUnityContainer()
        private IUnityContainer GetUnityContainer()
        {
            IUnityContainer container = new UnityContainer()
            .RegisterType<IControllerActivator, CustomControllerActivator>()
            .RegisterType<ILogger, FlatFileLogger>();
            return container;
        }
然后在Application_Start方法中添加如下代码,首先通过GetUnityContainer方法获得container,并且设置当前的Resolver是我们自己实现的UnityDependencyResolver。
protected void Application_Start()
        {
            IUnityContainer container = GetUnityContainer();
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
在Controller中我们只需要添加一个[Dependency]特性,就可以很方便的获取到我们注入的Logger。
    public class HomeController : Controller
    {
        [Dependency]
        public ILogger Logger { get; set; }
        public ActionResult Index()
        {
            ViewBag.Message = "我来了!!!";
            Logger.Write("哈哈哈");
            return View();
        }
    }
使用Unity在MVC上实现动态注入的更多相关文章
- [ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面
		
原文:[ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面 随着最终用户对用户体验需求的不断提高,实际上我们很多情况下已经在按照桌面应用的标准来设计Web应用,甚至很多Web页面本身就 ...
 - DI 依赖注入之unity的MVC版本使用Microsoft.Practices.Unity1.2与2.0版本对比
		
DI 依赖注入之unity的MVC版本使用Microsoft.Practices.Unity1.2与2.0版本对比 参考:https://www.cnblogs.com/xishuai/p/36702 ...
 - .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
		
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
 - Spring MVC 上传文件
		
Spring MVC上传文件需要如下步骤: 1.前台页面,form属性 method设置为post,enctype="multipart/form-data" input的typ ...
 - ASP.NET Core MVC上传、导入、导出知多少
		
前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天才研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ...
 - iOS中动态注入JavaScript方法。动态给html标签添加事件
		
项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...
 - Java 扫描实现 Ioc 动态注入,过滤器根据访问url调用自定义注解标记的类及其方法
		
扫描实现 Ioc 动态注入 参考: http://www.private-blog.com/2017/11/16/java-%e6%89%ab%e6%8f%8f%e5%ae%9e%e7%8e%b0-i ...
 - 使用Autofac动态注入启动Api服务
		
Autofac Autofac(https://autofac.org/)是一款.NET的IOC组件,它可以和Owin, Web Api, ASP.NET MVC, .NET Core完美结合,帮助开 ...
 - java高级-动态注入替换类Instrumentation
		
介绍 利用java.lang.instrument(容器类) 做动态 Instrumentation(执行容器) 是 Java SE 5 的新特性. 使用 Instrumentation,开发者可以构 ...
 
随机推荐
- bootstrap小结
			
bootstrap总结 bootstrap总结 base css 我分为了几大类 1,列表 .unstyled(无样式列表),.dl-horizontal(dl列表水平排列) 2,代码 code(行级 ...
 - hdu5348 MZL's endless loop(欧拉回路)
			
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud MZL's endless loop Time Limit: 3000/1500 ...
 - HDU 3001 状压DP
			
有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路 成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...
 - Ruby和Rails开发环境安装
			
更新包管理 sudo apt-get update 安装curl sudo apt-get install curl *安装rvm via curl \curl -L https://get.rvm. ...
 - 慕课linux学习笔记(二)Xshell与虚拟机的连接
			
选择使用的是Xshell5 新建连接 连接成功 修改编码方式,字号,颜色 PS: 连接过程中遇到了很多问题,虚拟机的网络连接我最初选择的是桥连,虚拟机和主机相互之间都能ping通但Xshell就是连接 ...
 - 如何向java后台的对象中传数组
			
1.后台对象的参数需要是是list对象 /* * copyright : GLOBALROAM Ptd Ltd * VmCreateInfo.java * Author: * zhangpengyan ...
 - python下如何处理windows的路径名
			
f = open(r'e:\迅雷下载\TEK-071\test.txt','r') 在windows下\会被认为是转义字符,所以需要在字符串前加上r,来告诉计算机后面的字符串是没有转义的.
 - Monkey and Banana(HDU 1069 动态规划)
			
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
 - [bzoj1002][FJOI2007 轮状病毒] (生成树计数+递推+高精度)
			
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
 - python安装setuptools和pip
			
今天需要写一个python导出excel的小程序.这里需要用到XlsxWriter模块,但是这个模块并没有安装,所以需要先下载该模块,然后才能在程序中使用.这里就需要安装模块,我选择使用pip.以下就 ...