IOC容器:Unity

一、什么是IOC

学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理。

依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖。依赖于抽象,而不是依赖于细节。

首先来看下面的例子:

1、定义一个接口,封装数据库的基本CRUD操作,接口定义如下:

  public interface IDbInterface
    {
        string Insert();
        string Delete();
        string Update();
        string Query();
    }

2、定义一个MSSQL类实现该接口,用来模仿SQLServer操作,MSSQL类定义如下:

 public class DBMSSQL : IDbInterface
    {
        public string Delete()
        {
            return "MSSQL执行删除";
        }

        public string Insert()
        {
            return "MSSQL执行插入";
        }

        public string Query()
        {
            return "MSSQL执行查询";
        }

        public string Update()
        {
            return "MSSQL执行更新";
        }
    }

3、定义一个Oracle类实现该接口,模仿Oracle的操作,Oracle类定义如下:

  public class DBORA : IDbInterface
    { 
        public string Delete()
        {
            return "Oracle执行删除";
        }

        public string Insert()
        {
            return "Oracle执行插入";
        }

        public string Query()
        {
            return "Oracle执行查询";
        }

        public string Update()
        {
            return "Oracle执行更新";
        }
    }

4、使用配置文件实现

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
  </configSections>
  <unity>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
    <containers>
      <container name="testContainer">
         <!--逗号后面是程序集的名称-->
        <register type="IOCConsoleApp.IDbInterface,IOCConsoleApp" mapTo="IOCConsoleApp.MSSQL.DBMSSQL,IOCConsoleApp" name="sql"/>
        <register type="IOCConsoleApp.IDbInterface,IOCConsoleApp" mapTo="IOCConsoleApp.ORA.DBORA, IOCConsoleApp" name="oracle"/>
      </container>
    </containers>
  </unity>
</configuration>

注意:这个一个单独的配置文件,要把属性里面的复制到输出目录改为始终复制,那么这个配置文件才会生成到Debug目录里面。

程序如下:

 
   ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
   fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "unity.config");//找配置文件的路径
   Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
   UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
   IUnityContainer container = new UnityContainer();
   section.Configure(container, "testContainer");
   IDbInterface db = container.Resolve<IDbInterface>("sql");
   Console.WriteLine(db.Insert());
原文地址:https://www.cnblogs.com/DavidAi/p/13043912.html