生活中的“控制反转”:自己发电和用电网的电。
自己发电需要自购发电机,自学发电方法,维护发电设备等等。
用电网的电只需要付费就可以直接使用。
依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的具体实现。
依赖注入优点:
简化模块的组装过程,降低模块之间的耦合度。
控制反转的目的:
由原来的“怎样创建XX对象”→“我要XX对象”。
控制反转两种实现方式:
1.服务定位器(ServiceLocator)
2.依赖注入(Dependency Injection,DI)
依赖注入的几个概念:
服务(service):对象。
注册服务。
服务容器:负责管理注册的服务。
查询服务:创建对象及关联对象。
对象声明周期:transient(瞬态);scoped(范围);singleton(单例)。
瞬态:每次获取都是新的对象。
范围:在一个范围内,每次获取都是同一个对象。
单例:在任何范围获取的都是同一个对象。
代码示例:
定义一个接口和一个实现接口的类
public interface ITestService
{
public string Name { get; set; }
public void SayHi();
}
public class TestServiceImpl1 : ITestService
{
public string Name { get; set; }
public void SayHi()
{
Console.WriteLine($"hello,I'm {Name}");
}
}
声明类的实例对象并调用类中的方法:
static void Main(string[] args)
{
//常规写法
{
ITestService t = new TestServiceImpl1();
t.Name = "jam";
t.SayHi();
}
//IOC写法
{
ServiceCollection services = new ServiceCollection(); //构造容器对象
services.AddTransient<TestServiceImpl1>();
using (ServiceProvider sp = services.BuildServiceProvider()) //ServiceProvider 依赖注入系统的一个核心对象,调用ServiceCollection
{
ITestService t = new TestServiceImpl1();
t.Name = "jam";
t.SayHi();
}
}
Console.Read();
}
两种写法,最后的结果都是一样的:
第一种写法是常规的写法,第二种写法是IOC控制反转的实现方式。
需要引用控制反转组件 Extensions.DependencyInjection
总结:
1、可以根据类型来获取和注册服务。分别指定服务类型(service type)和实现类型(implementation type)。这两者可能相同,也可能不同。
服务类型可以是类,也可以是接口,建议面向接口编程,更灵活。
2、.net控制反转组件取名为DependencyInjection,但它包含ServiceLocator的功能。
3、.net中使用依赖注入,需要引用包Extensions.DependencyInjection。
4、ServiceCollection用来构造容器对象IServiceCollection,调用ServiceCollection的BuildServiceProvider()创建的ServiceProvider,可以用来获取BuildServiceProvider()之前ServiceCollection中的对象。