.NETCore——依赖注入

本文章是我听B站杨中科的所做的笔记

杨中科B站视频链接:.NET 6教程,.Net Core 2022视频教程,杨中科主讲_哔哩哔哩_bilibili

1、概念

生活中的“控制反转”:自己发电和用电网的电

依赖注入是控制反转思想的实现方式

依赖注入简化模块的组装过程,降低模块之间的耦合度

控制反转的两种实现方式:1、服务定位器 2、依赖注入

服务定位器:

IDbConnection conn = ServiceLocator.GetService();

依赖注入:

class Demo
{
    public IDbConnection Conn { get; set; }
    public void InsertDB()
    {
        IDbCommand cmd = Conn.CreateCommand();
    }
}

2、DI几个概念

服务(service):对象 注册服务; 服务容器:负责管理注册的服务 查询服务:创建对象及关联对象; 对象生命周期:Transient(瞬态);Scoped(范围);Singleton(单例)

3、.net中使用DI

根据类型来获取和注册服务。可以分别指定服务类型(ServiceType)和实现类型(ImplementationType)。这两者可能相同,也可能不同。服务类型可以是类,也可以是接口,建议面向接口编程,更灵活

步骤:

1、Install-Package Microsoft.Extensions.DependencyInjection

2、using Microsoft.Extensions.DependencyInjection

3、ServiceCollection用来构造容器对象ServiceProvider 。调用ServiceCollection的BuildServiceProvider()创建的ServiceProvider,可以用来获取BuildServiceProvider()之前

4、DI生命周期

1、如果一个类实现了IDisposable接口,则离开作用域之后容器会自动调用对象的Dispose方法

2、不要再长生命周期的对象中引用比它短的生命周期的对象。再ASP.NET Core中,这样做默认会抛异常

3、生命周期的选择:如果类无状态,建议为Singleton;如果类有状态,且有Scope控制,建议为Scoped,因为通常这种Scope控制下的代码都是运行在同一个线程中的,没有并发修改的问题;在使用Transient的时候要谨慎

5、DI魅力渐显:依赖注入

1、依赖注入是由传染性的,如果一个类的对象是通过DI类创建的,那么这个类的构造函数中声明的所有服务类型参数都会被DI赋值;但是如果一个对象是程序员手动创建的,那么这个对象就和DI没有关系,它的构造函数中声明的服务类型参数就不会被自动赋值

2、.NET的DI默认是构造函数注入

6、总结

关注于接口,而不是关注于实现,各个服务可以更弱耦合的协同工作。在编写代码的时候,我们甚至不知道具体的服务是什么

第三方DI容器:Autofac等。Autofac优点:支持属性注入、基于名字注入、基于约定的注入等

你可能感兴趣的:(.netcore)