suixinsuoyu 2020-04-29
概念:
DIP(依赖倒置原则):软件在进行架构设计的时候的一种原则
高层定义接口,底层负责实现 ATM机(高层) 银行卡(底层) ATM定义一个插卡口(接口),不管是哪家银行的卡,都可以进行取钱
IOC(控制反转):DIP的具体实现方式 如果没有插卡口 那么 中国银行的卡只能用中国银行的ATM 现在把他们的依赖抽出来 放到插卡口 那么 银行卡 ATM都只依赖第三方插卡口
DI(依赖注入):IOC的一种实现方式
拿用户类插入数据库业务举列:
namespace IOC示例 { class Program { static void Main(string[] args) { //此时sql如果想换成oracle 是不是很麻烦,如果是正常的程序再跑的话 得新增一个oracle插入到数据库的类,然后更改user里面的方法 user user = new user(); user.name = "名字"; user.Add(); } } public class SqlServerDal { //具体实现 public void insert() { Console.Write("将用户插入到数据库"); } } public class user { private readonly SqlServerDal dal = new SqlServerDal();//添加一个私有变量保存数据库操作的对象 public void Add() { dal.insert(); } public string name { get; set; } } }
通过构造函数注入,进行解耦
using System; namespace IOC示例 { class Program { static void Main(string[] args) { //此时 sqlservice 和user 已经进行了解耦 SqlServerDal sqlDal = new SqlServerDal();//在外部创建依赖对象 user user = new user(sqlDal);//通过构造函数注入依赖 //BOSS说要换成oracle oracle oracleDal = new oracle();//在外部创建依赖对象 user userOracle = new user(oracleDal);//通过构造函数注入依赖 //发现没有改造只需要改造 oracle, user是完全不用动的 后面要换成任何数据库都行,不会牵扯大的改造 user.Add(); } } #region 定义抽象 public interface IdataBase { void Add(); } #endregion #region 数据库 public class SqlServerDal : IdataBase { //具体实现 public void Add() { Console.Write("将用户插入到数据库"); } } public class oracle : IdataBase { public void Add() { Console.Write("将用户插入到数据库"); } } #endregion #region 用户类 public class user { private IdataBase _ida;//定义一个私有变量保存抽象 public user(IdataBase ida) { _ida = ida; } public void Add() { _ida.Add(); } public string name { get; set; } } #endregion }
IOC容器:依赖注入的框架
IOC容器是啥,就是懒, 把依赖注入手动变成自动化,
原先手动 然后用了 Spring.NET框架 Autofac框架 Ninject框架..等等等
using System; using Ninject;//添加Ninjecty服务引用 namespace IOC示例 { class Program { static void Main(string[] args) { StandardKernel kernel = new StandardKernel();//创建Ioc容器 kernel.Bind<IdataBase>().To<SqlServerDal>();//注册依赖 user user = kernel.Get<user>();//获取目标对象 user.Add(); //看起来和手动没区别,但是正常项目中,手动第一效率低 自己创建和注入依赖,容易失误,相互依赖组件多的话,很容易出错 Console.Read(); } } #region 定义抽象 public interface IdataBase { void Add(); } #endregion #region 数据库 public class SqlServerDal : IdataBase { //具体实现 public void Add() { Console.Write("将用户插入到数据库"); } } public class oracle : IdataBase { public void Add() { Console.Write("将用户插入到数据库"); } } #endregion #region 用户类 public class user { private IdataBase _ida;//定义一个私有变量保存抽象 public user(IdataBase ida) { _ida = ida; } public void Add() { _ida.Add(); } public string name { get; set; } } #endregion }
更完整详细参考例子:https://www.cnblogs.com/liuhaorain/p/3747470.html#!comments