IOC():控制反转,把程序上层对下层的依赖,转移到第三方的容器来装配
是程序设计的目标,实现方式包含了依赖注入和依赖查找(.net里面只有依赖注入)
DI:依赖注入,是IOC的实习方式。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity;
using ZEN.Interface;
using ZEN.Service;
namespace UnityIOC
{
class Program
{
static void Main(string[] args)
{
//定义一个IOC容器
IUnityContainer container = new UnityContainer();
//添加映射关系
container.RegisterType<ICar, TeslaCar>();
//获取服务
var car = container.Resolve<ICar>();
car.GetName();
car.GetPrice();
car.GetMaxSpeed();
Console.ReadKey();
}
}
}
一个接口多个实现进行注册
如: 接口 IPhone
实现华为手机 继承 IPhone
实现苹果手机 继承 IPhone
IUnityContainer container = new UnityContainer();//1、定义一个空容器
container.RegisterType<IPhone, HuaweiPhone>(“huawei”);//2、注册类型,表示遇到IDbInterface的类型,创建DbMSSQL的实例
container.RegisterType<IPhone, ApplePhone>(“apple”);//表示遇到IDbInterface的类型,创建DbMSSQL的实例
var huawei= container.Resolve(“huawei”);
var apple= container.Resolve(“apple”);
Console.WriteLine(huawei.xxx());
Console.WriteLine(apple.xxx());
以上还是依赖细节,完全脱离细节,需要用配置文件,跟autofac一样
这样每次生成,才会把配置文件生成到bin目录下
会发现,如果改成使用配置文件的方式实现的话,代码里面就不会依赖于细节了,只要一个接口类型。既然没有细节了,那么对项目进行如下的改造:把引用里面对细节的引用都去掉(ZEN.Service),然后Debug文件夹里面没有这个DLL了,但是这时需要把这个DLL复制到Debug目录下面,否则程序运行的时候会找不到具体实现的类型。这样就意味着程序架构只依赖于接口。