什么是IOC?

控制反转(IOC):就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现

什么是DI?

依赖注入(DI):它提供一种机制,将需要依赖(低层模块)对象的引用传递给被依赖(高层模块)对象。

什么是容器?

容器用来装东西的,无论什么容器。在IOC中,就是用来存放依赖关系,并且能将抽象实例成对应对象的地方。

Unity实现IOC

这里用框架Unity来实现IOC

  1. 首先导入包:


    22_C#之IOC - 图1

在MVC项目中,可以使用Unity MVC的包,在global中配置初始化。

  1. 注册容器:

  • 从配置文件注册容器:
  1. using Microsoft.Practices.Unity.Configuration;
  2. using System.Configuration;
  3. using Tools.PathConfigManagerTool;
  4. using Unity;
  5. namespace Tools.UnityTool
  6. {
  7. /// <summary>
  8. /// 通过配置文件配置需要注入的依赖,配置文件需要放在启动程序的根目录,在路径管理中配置。
  9. /// </summary>
  10. public static class UnityContainerByFileTool
  11. {
  12. private static IUnityContainer unity = null;
  13. public static IUnityContainer GetUnityContainer()
  14. {
  15. if (unity==null)
  16. {
  17. // 固定写法
  18. ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap
  19. {
  20. // 相对于主路径根目录
  21. ExeConfigFilename = PathConfig.UnityConfigRelativePath
  22. };
  23. Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
  24. UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
  25. // 声明容器
  26. unity = new UnityContainer();
  27. // 对应配置文件中container的名称
  28. section.Configure(unity, "UnityContainer");
  29. }
  30. return unity;
  31. }
  32. }
  33. }
  • 从代码注册容器:
  1. using BLL;
  2. using System;
  3. using Unity;
  4. namespace Tools.UnityTool
  5. {
  6. /// <summary>
  7. /// 通过程序来注册
  8. /// </summary>
  9. public static class UnityContainerByProcedureTool
  10. {
  11. private static readonly IUnityContainer unityContainer = new UnityContainer();
  12. public static IUnityContainer GetUnityContainer()
  13. {
  14. try
  15. {
  16. // 在此配置需要注入的依赖,在程序中注册的实例不会向文件中书写。
  17. unityContainer.RegisterType<IService, Service>();
  18. unityContainer.RegisterType<IBLLTest, BLLTest>();
  19. unityContainer.RegisterType<IUser, User>();
  20. }
  21. catch (Exception)
  22. {
  23. throw;
  24. }
  25. return unityContainer;
  26. }
  27. }
  28. }
  1. 使用

    UnityContainer unityContainer = (UnityContainer)UnityContainerByProcedureTool.GetUnityContainer();
    var service = unityContainer.Resolve<IUser>();
    

还有构造函数注入。

属性注入。

方法注入。