一、什么是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());