.Net Core 依赖注入

依赖是指:当完成某个功能的时候需要依赖其它对象,其它类.

注入:不需要我们自己去创建对象了,由第三方工具去帮我们创建,             然后传给我们使用,.Net Core已经自带依赖注入的框架.

构造函数注入 服务作为构造函数参数添加,并且运行时从服务容器中解析服务。 通常使用接口来定义服务。

定义一个服务:

 构造函数注入:

 使用FromServices注入:

 

控制反转(IoC(Inverse of Control))

控制反转:应用程序中的依赖关系方向应该是抽象的方向,而不是实现详细信息的方向。

抽象:指的是接口或者抽象类,详细信息就是具体的实现类,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,那么A类依赖B类,B类要依赖于C类

 什么是接口: 接口是一种约束形式,其中只包括成员定义,不包含成员具体的实现,是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。

 

 控制反转(依赖抽象)的优点:可以减少我们代码的改动, 可维护性更高,易于扩展。

构造函数注入

就是在构造函数去接收第三方创建后传过来的对象。

构造函数:是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。

 

 服务生存期

Singleton:单一实例对象对于每个请求是相同的;

Transient:临时性对象始终不同;       

Scoped:范围内对象,对一次请求而言是相同的,但在每个新请求之间不同;

 

为什么要使用依赖注入框架

  • 借助依赖注入框架,将对象的创建交由容器管理,确保代码的可维护性和可扩展性。
  • .NET Core 的整个架构中,依赖注入框架提供了对象创建和生命周期管理的核心能力,各个组件相互协作,也是由依赖注入框架的能力来实现的。

依赖关系注入概述

依赖项是指另一个对象所依赖的对象。 使用其他类所依赖的 WriteMessage 方法检查以下 MyDependency 类:

public class MyDependency
{
    public void WriteMessage(string message)
    {
        Console.WriteLine($"MyDependency.WriteMessage called. Message: {message}");
    }
}

 类可以创建 MyDependency 类的实例,以便利用其 WriteMessage 方法。 在以下示例中,MyDependency 类是 IndexModel 类的依赖项:

public class IndexModel : PageModel
{
    private readonly MyDependency _dependency = new MyDependency();

    public void OnGet()
    {
        _dependency.WriteMessage("IndexModel.OnGet");
    }
}

该类创建并直接依赖于 MyDependency 类。 代码依赖项(如前面的示例)会产生问题,应避免使用,原因如下:

  • 要用不同的实现替换 MyDependency,必须修改 IndexModel 类。
  • 如果 MyDependency 具有依赖项,则必须由 IndexModel 类对其进行配置。 在具有多个依赖于 MyDependency 的类的大型项目中,配置代码将分散在整个应用中。
  • 这种实现很难进行单元测试。

依赖关系注入通过以下方式解决了这些问题:

  • 使用接口或基类将依赖关系实现抽象化。
  • 在服务容器中注册依赖关系。 ASP.NET Core 提供了一个内置的服务容器 IServiceProvider。 服务通常已在应用的 Program.cs 文件中注册。
  • 将服务注入到使用它的类的构造函数中。 框架负责创建依赖关系的实例,并在不再需要时将其释放。

示例应用中, 接口定义 WriteMessage 方法:

 

public interface IMyDependency
{
    void WriteMessage(string message);
}

.Net Core DI

Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.DependencyInjection 

Microsoft.Extensions.DependencyInjection.Abstractions 为抽象包,Microsoft.Extensions.DependencyInjection 为具体实现包

核心类

IServiceCollection
ServiceDescriptor
IServiceProvider
IServiceScope

IServiceCollection 负责注册,作为Startup类中ConfigureServices方法的参数,使用其对对象进行注册。
ServiceDescriptor 负责注入服务元素的描述
IServiceProvider 负责提供实例
IServiceScope 负责实例的生命周期

三种生命周期

  • 瞬时 Transient:每次请求,都获取一个新的实例;即使同一个请求获取多次也会是不同的实例。
  • 作用域 Scoped: 每次请求,都获取一个新的实例;同一个请求获取多次会得到相同的实例,即一个http请求内唯一。
  • 单例 Singleton:每次都获取同一个实例。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机应用技术软件外包服务方向2班唐武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值