一、什么是IOC
学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理。
依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖。依赖于抽象,而不是依赖于细节。
首先来看下面的例子:
1、定义一个接口,封装数据库的基本CRUD操作,接口定义如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;namespace DataBase.Interface{ /// <summary> /// 数据访问接口 /// </summary> public interface IDbInterface { string Insert(); string Delete(); string Update(); string Query(); }}2、定义一个MSSQL类实现该接口,用来模仿SQLServer操作,MSSQL类定义如下:
using DataBase.Interface;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DataBase.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类定义如下:
using DataBase.Interface;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DataBase.Oracle{ public class DbOracle : IDbInterface { public string Delete() { return "Oracle执行删除"; } public string Insert() { return "Oracle执行插入"; } public string Query() { return "Oracle执行查询"; } public string Update() { return "Oracle执行更新"; } }}4、定义一个控制台应用程序来调用:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using DataBase.Interface;using DataBase.MSSQL;namespace IOCConApp{ class Program { static void Main(string[] args) { // 常规做法,即程序的上端,依赖于下端,依赖于细节 DbMSSQL mssql = new DbMSSQL(); } }}常规做法是添加引用,然后直接实例化类,但是这样会依赖于细节实现,现将代码修改如下:
// 通过抽象来依赖IDbInterface dbInterface = new DbMSSQL();
但是这样修改以后,虽然左边是抽象了,但是右边还是依赖于细节。
那就究竟什么是IOC呢?
IOC(Inversion of Control)即控制反转,是一个重要的面向对象编程的法则来消减程序之间的耦合问题,把程序中上层对下层依赖,转移到一个第三方容器中来装配。IOC是程序设计的目标,实现方式包含依赖注入和依赖查找,在.net中只有依赖注入。
说到IOC,就不能不说DI。DI:即依赖注入,是IOC的实现手段。
二、使用Unity实现IOC
Unity是一个IoC容器,用来实现依赖注入(Dependency Injection,DI),减少耦合的,Unity出自于伟大的微软。
unity能够做什么呢,列举部分如下:
1.Unity支持简单对象创建,特别是分层对象结构和依赖,以简化程序代码。其包含一个编译那些可能存在依赖于其他对象的对象实例机制。onfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\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());
结果:

观察上面的代码,会发现,如果改成使用配置文件的方式实现的话,代码里面就不会依赖于细节了,只要一个接口类型。既然没有细节了,那么对项目进行如下的改造:把引用里面对细节的引用都去掉(即去掉DataBase.MSSQL和DataBase.Oracle),然后Debug文件夹里面没有这两个DLL了,但是这时需要把这两个DLL复制到Debug目录下面,否则程序运行的时候会找不到具体实现的类型。这样就意味着程序架构只依赖于接口。

引用里面只要对接口的引用了,没有对具体实现的引用。去掉了对细节的依赖。
注意:使用配置文件实现时,必须把接口的具体实现类复制到程序目录下面。
如果有额外添加了一种数据库,那么只需要修改配置文件,把新的实现类复制到程序目录下面即可实现程序的升级。
使用配置文件的时候,需要把UnityContainer容器定义为静态的,这样只需要读取一次配置文件即可。
到此这篇关于C#使用Unity实现IOC的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








