什么是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>();
还有构造函数注入。
属性注入。
方法注入。