【c#】 .NET Core 依赖注入

         后续内容都是采用VS2022以及c#最新语法,有不能理解的地方,欢迎观看我的C#新语法篇:https://blog.csdn.net/lihuxie/article/details/132312437?spm=1001.2014.3001.5501https://blog.csdn.net/lihuxie/article/details/132312437?spm=1001.2014.3001.5501

 一、什么是控制反转、服务定位器和依赖注入

控制反转(inversion of control, IOC)是设计模式中最重要的思想,而依赖注入(dependency injection, DI)是控制反转思想的一种重要实现方式。依赖注入简化了模块的组装过程,减少了模块之间的耦合度。

        在传统的软件行业,代码依赖的对象都是由调用者自己来编写代码进行创建和组装。如下代码所示,先从配置文件Web.config读取数据库连接字符串,然后创建程序到数据库连接。 

var connStr = ConfigurationManager.ConnectionStrings["connStr1"].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
conn.StatisticsEnabled = true ;

        缺点是开发者必须清楚每个类的作用,已经如何构建和组装他们,代码对这些组件也有强依赖性。所有就要使用到控制反转,那什么是控制反转呢?

控制反转:把“创建和组装对象”操作的控制权从业务逻辑的代码中转移到框架中。( 简单地说就是业务代码中只需要说明“我需要某个类型的对象”,框架就会帮助我们创建这个对象。)

        (1)服务器定位器

        (2)依赖注入

服务器定位器(service locator):

        假设框架中有个类叫ServiceLocator,只需要调用它的GetService方法就可以获取想要的对象,至于对象是怎么创建的我们不用关心。

IDbConnection conn = ServiceLocator.GetService<IDbConnection>();

依赖注入:

        假设框架中有一个自动为类的属性赋值的功能,只要在代码中声明说明我们需要什么类型的对象,框架就会自动创建这个对象。

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

        上面代码运行在某个框架中,这个框架创建Demo对象之后,它会自动为Conn属性赋值一个合适的对象。这种框架自动创建对象的动作就叫作“注入”。

二、依赖注入的基本使用

        .NET Core中内置了控制反转机制,它同时支持依赖注入和控制反转两种方式,由于依赖注入是微软推荐的方式,因为微软将内置的控制反转组件命名为DependencyInjection,但是也包含了服务器定位功能。

依赖注入框架中注册服务有一个重要的概念叫做“生命周期”,通俗的讲就是“获取服务的时候是创建一个新对象还是用之前的对象”。有以下三种: 

(1)瞬态(transient):每次被请求的时候都会创建一个新的对象。

(2)范围(scoped):在给定的范围内,多次请求共享同一个服务对象,服务每次被请求的时候都会返回同一个对象;在不同的范围内,服务每次被请求都返回不同的对象。(在Asp.NET Core中,默认服务范围是一次Http请求)。

(3)单例(Singleton):全局共享一个服务对象。

        在面向对象编程中,推荐使用面向接口编程,这样我们的代码就依赖于服务接口,而不是依赖于实现类,可以实现代码解耦,因此在使用依赖注入的时候,推荐服务类型用接口类型。

案例如下:

        依赖注入是一个比较复杂的概念,这里只是讲述一点大致基础内容。 

猜你喜欢

转载自blog.csdn.net/lihuxie/article/details/132342659