搞定.NET MVC IOC控制反转,依赖注入

一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记!

1、首先创建MVC项目

2、然后新建一个接口IServiceA

public interface IServiceA
    {
        string Name();
    }

实现接口

public class ServiceA : IServiceA
    {
        public string Name()
        {
            return "Service A";
        }
    }

简单点说,就是要把IService的调用自动注入ServiceA类型

新建MVC控制器:HomeController并添加构造函数

    public class HomeController : Controller
    {
        protected Service.IServiceA ServiceA;
        public HomeController(Service.IServiceA a)
        {
            this.ServiceA = a;
        }
    }

下面我们来实现如何通过IOC把IServiceA注入为ServiceA类型

Nuget添加引用,搜索Unity,如果提示失败的话,就用Nuget的命令添加以前的版本,不知道怎么敲就直接添加PolicyInJection引用好了

新建类:UnityDependencyReslover

public class UnityDependencyReslover : System.Web.Mvc.IDependencyResolver
    {
        IUnityContainer container;
        public UnityDependencyReslover(IUnityContainer container)
        {
            this.container = container;
        }

public object GetService(Type t)
        {
            if (t == null) return null;
            if (!container.IsRegistered(t)) return null;
            return container.Resolve(t);
        }

public IEnumerable<object> GetServices(Type t)
        {
            return container.ResolveAll(t);
        }
    }

这个没有啥好说的把,就是实现类型映射的解析而已

Global.asax的Application_Start中注册解析类型映射

IUnityContainer container = new UnityContainer();

container.RegisterType<Service.IServiceA, Service.ServiceA>();

container.RegisterType<IControllerFactory, IOC.MyControllerFactory>();

DependencyResolver.SetResolver(new IOC.UnityDependencyReslover(container));

看标红的那句,这里简单说明一下,HomeController的构造函数带了参数,默认情况下MVC的控制器初始化没有参数的,这里我们要自己去实现对参数的解析,也就是在这个地方注入参数,不然你的MVC控制器无法访问

新建:MyControllerFactory继承System.Web.Mvc.DefaultControllerFactory
public class MyControllerFactory : DefaultControllerFactory

{

  IUnityContainer container;

public MyControllerFactory(IUnityContainer container)
   {

this.container = container;

}

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
   {
     if (controllerType == null) return null;
     return container.Resolve(controllerType) as IController;
   }
}

这样就行啦!

在你的MVC的HomeController里面添加一个Action访问下IServiceA的Name方法试试,是不是可以了!

这里我要说明一下,有几个地方要注意:那个IUnityContainer 要统一,先前我尝试过一直不成功,后来发现是有的地方用的是UnityContainer,所以还是要认真一点!

添加代码,代码无法高亮加粗,所以没用代码形式添加!

时间: 2024-10-13 17:34:14

搞定.NET MVC IOC控制反转,依赖注入的相关文章

玩转Spring MVC (一)---控制反转(依赖注入)

Spring的核心是控制反转,什么是控制反转呢?小编浅述一下自己的拙见,有不当之处还希望大家指出. 控制反转(IOC),也可以叫做依赖注入(DI),这两个词其实是一个概念. 控制反转,那是什么控制被反转了呢?Martin Fowler总结出是"依赖对象的获得"被反转了. 什么是"依赖对象"呢?大多数情况下,java中的都需要通过多个类的合作实现某种业务逻辑,每个对象都需要与他合作的对象的引用,这个与他合作的对象就是它的"依赖对象". 如果我们要引

Spring IOC - 控制反转(依赖注入) - 创建对象的方式

a.通过类的无参构造方法创建对象 在入门案例中就是这种方式.当用最普通的方式配饰一个<bean>时,默认就是采用类的 无参构造创建对象.在Spring容器初始化时,通过<bean>上配置的class属性反射的到字 节码对象,通过newInstance()创建对象. Class c = Class .forName("类的全路径名称") Object obj = c.newInstance() 这种方式下Spring创建对象,必须有无参的构造,否则无法通过反射创建

Spring IOC - 控制反转(依赖注入) - 配置初始化和销毁的方法

在Spring中如果某个bean在初始化之后,或销毁之前要做一些额外操作可以为该bean配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 package cn.tedu.beans; public class ProdDao { public ProdDao() { System.out.println("ProdDao 被创建..."); } public void init() { System.out.println

Spring 学习 2- IOC原理 控制反转/依赖注入

控制反转/依赖注入 最近,买了本spring入门书:spring In Action .大致浏览了下感觉还不错.就是入门了点.Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning,但怀着崇敬的心情和激情通览了一遍.又一次接受了IOC .DI.AOP等Spring核心概念. 先就IOC和DI谈一点我的看法. IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中的每个业务逻辑至少需要

spring IOC控制反转 DI注入

<!-- 初始化 init-method="init" 销毁destroy-method="destory" --> <!--懒加载 lazy-init="true" --> <bean id="IUDao" class="dao.IUDao" scope="singleton" init-method="init" destroy-me

大话依赖倒置?控制反转?依赖注入?面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些“高深术语”感到过困扰——依赖倒置•控制反转•依赖注入•面向接口编程.也许时至今日,你仍对它们一知半解.不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. ·内聚 内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做. 经典理论告诉我们,程序的两大要素:一个是数据(data),

控制反转&amp;依赖注入

控制反转 如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的.那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A 类中. 依赖注入 依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同.依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源:而控制反转是从容器的角度在描述,

那些年搞不懂的高深术语——依赖倒置?控制反转?依赖注入?面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些“高深术语”感到过困扰.也许时至今日,你仍对它们一知半解.不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. ·内聚 内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做. 经典理论告诉我们,程序的两大要素:一个是数据(data),一个是操作(opration).而 PASCA

Spring框架使用(控制反转,依赖注入,面向切面AOP)

参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion of control 控制反转:由容器控制程序之间的关系,不是程序代码操作 Depend Inject 依赖注入 Aspect oriented programming 面向切面编程 Spring能帮助我们根据配置文件创建及组装对象之间的依赖关系: Spring面向切面编程能帮助我们无耦合的实现日