C#使用Unity实现IOC

2022-04-17 10:39:42

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

结果:

C#使用Unity实现IOC

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

C#使用Unity实现IOC

引用里面只要对接口的引用了,没有对具体实现的引用。去掉了对细节的依赖。

注意:使用配置文件实现时,必须把接口的具体实现类复制到程序目录下面。

如果有额外添加了一种数据库,那么只需要修改配置文件,把新的实现类复制到程序目录下面即可实现程序的升级。

使用配置文件的时候,需要把UnityContainer容器定义为静态的,这样只需要读取一次配置文件即可。

到此这篇关于C#使用Unity实现IOC的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。