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