什么是IOC?
控制反转(IOC):就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现。
什么是DI?
依赖注入(DI):它提供一种机制,将需要依赖(低层模块)对象的引用传递给被依赖(高层模块)对象。
什么是容器?
容器用来装东西的,无论什么容器。在IOC中,就是用来存放依赖关系,并且能将抽象实例成对应对象的地方。
Unity实现IOC
这里用框架Unity来实现IOC
在MVC项目中,可以使用Unity MVC的包,在global中配置初始化。
- 从配置文件注册容器:
using Microsoft.Practices.Unity.Configuration;using System.Configuration;using Tools.PathConfigManagerTool;using Unity;namespace Tools.UnityTool{/// <summary>/// 通过配置文件配置需要注入的依赖,配置文件需要放在启动程序的根目录,在路径管理中配置。/// </summary>public static class UnityContainerByFileTool{private static IUnityContainer unity = null;public static IUnityContainer GetUnityContainer(){if (unity==null){// 固定写法ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap{// 相对于主路径根目录ExeConfigFilename = PathConfig.UnityConfigRelativePath};Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);// 声明容器unity = new UnityContainer();// 对应配置文件中container的名称section.Configure(unity, "UnityContainer");}return unity;}}}
- 从代码注册容器:
using BLL;using System;using Unity;namespace Tools.UnityTool{/// <summary>/// 通过程序来注册/// </summary>public static class UnityContainerByProcedureTool{private static readonly IUnityContainer unityContainer = new UnityContainer();public static IUnityContainer GetUnityContainer(){try{// 在此配置需要注入的依赖,在程序中注册的实例不会向文件中书写。unityContainer.RegisterType<IService, Service>();unityContainer.RegisterType<IBLLTest, BLLTest>();unityContainer.RegisterType<IUser, User>();}catch (Exception){throw;}return unityContainer;}}}
使用
UnityContainer unityContainer = (UnityContainer)UnityContainerByProcedureTool.GetUnityContainer(); var service = unityContainer.Resolve<IUser>();
还有构造函数注入。
属性注入。
方法注入。

