ASP.NET Core 中间件的使用(二):依赖注入的使用 (上)

简介: ASP.NET Core 中间件的使用(二):依赖注入的使用

写在前面

上一篇大家已经粗略接触了解到.NET Core中间件的使用:ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件

.NET Core框架中很多核心对象都是通过依赖注入的方式提供的,那什么是依赖注入?

这也是个老生常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control),DI等概念搞晕。


 

回到顶部

什么是依赖注入?

提到依赖注入,大家一定会想到控制反转,怎么了解,控制反转是一种设计原则(Inversion of Control,缩写为IoC),而依赖注入((Dependency Injection,简称DI))是它的一种实现方式。

当一个类需要另一个类协作来完成工作的时候就产生了依赖。比如我们在AccountController这个控制器需要完成和用户相关的注册、登录 等事情。

这里有一个设计原则:依赖于抽象,而不是具体的实现,当一个类依赖于具体依赖时,它被认为与该类紧密耦合

 

回到顶部

依赖注入的目的是为了什么?

控制反转用于解耦,将接口和实现的耦合降低,有一个好处就是,一个接口,可以进行不同的实现,这样提高扩展性,确保代码的可维护性和扩展性。

通俗的讲,就是对象在被使用前,我们需要New一下对象,创建一个实例对象,然后在进行其他操作。

 

回到顶部

怎么使用依赖注入?

.NET Core 自带了依赖注入的框架,我们可以归纳为这几个使用方式,当然还有很多使用方法(常规,泛型,工厂),就不一一举例了:

  • 构造函数注入;
  • 方法注入;
  • 属性注入;

这么归纳是不是感觉不太好理解?没关系,我们进一步细化为如下使用方式:

  1. 在Startup类型的构造函数中注入;
  2. 在Startup类型的Configure方法中注入;
  3. 在中间件类型构造函数中注入;
  4. 在中间件类型的Invoke/InvokeAsync方法中注入;
  5. 在Controller类型的构造函数中注入;
  6. 在Controller的Action方法中注入;

 


 

一、在Startup类型的构造函数中注入

配置的IConfiguration对象和表示承载环境的IHostEnvironment对象可以直接注入Startup构造函数中。

当然也可以通过注入IWebHostEnvironment对象的方式得到当前承载环境相关的信息,

这是因为ASP.NET Core应用中的承载环境通过IWebHostEnvironment接口表示,IWebHostEnvironment接口派生于IHostEnvironment接口)。

 

我们可以通过一个简单的实例来验证针对Startup的构造函数注入。

如下面的代码片段所示,我们在调用IWebHostBuilder接口的Startup<TStartup>方法时注册了自定义的Startup类型。

在定义Startup类型时,我们在其构造函数中注入上述3个对象,提供的调试断言不仅证明了3个对象不为Null,还表明采用IHostEnvironment接口和IWebHostEnvironment接口得到的其实是同一个实例。

 

class Program
{
    static void Main()
    {
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder.UseStartup<Startup>())
        .Build()
        .Run();
    }
}
public class Startup
{
    public Startup(IConfiguration configuration, IHostEnvironment hostingEnvironment,IWebHostEnvironment webHostEnvironment)
    {
        Debug.Assert(configuration != null);
        Debug.Assert(hostingEnvironment != null);
        Debug.Assert(webHostEnvironment != null);
        Debug.Assert(ReferenceEquals(hostingEnvironment, webHostEnvironment));
    }
    public void Configure(IApplicationBuilder app) { }
}

二、在Startup类型的Configure方法中注入

 

这种注入方式也叫管道注入,这种是使用比较多的一种注入方式,因为.NET Core创建项目的时候已经在Startup.cs类里面生成框架了(管道注入),

如果构造函数注入还可以对注入的服务有所选择,那么对于Configure方法来说,通过任意方式注册的服务都可以注入其中,包括通过调用

IHostBuilderIWebHostBuilderStartup自身的ConfigureServices方法注册的服务,还包括框架自行注册的所有服务。

如下面的代码代码片段所示,我们分别调用IWebHostBuilder和Startup的ConfigureServices方法注册了针对IStudent接口和ISchool接口的服务,这两个服务直接注入Startup的Configure方法中。另外,Configure方法要求提供一个用来注册中间件的IApplicationBuilder对象作为参数,但是对该参数出现的位置并未做任何限制。

class Program
{
    static void Main()
    {
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder
            .UseStartup<Startup>()
            .ConfigureServices(svcs => svcs.AddSingleton<IStudent, Student>()))
        .Build()
        .Run();
    }
}
public class Startup
{
    public void ConfigureServices(IServiceCollection services) => services.AddSingleton<ISchool, School>();
    public void Configure(IApplicationBuilder app, IStudent student, ISchool school)
    {
        Debug.Assert(student != null);
        Debug.Assert(school!= null);
    }
}
相关文章
|
22天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
22天前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
22天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
5天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
15 0
|
20天前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
25 4
|
2月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0
|
9月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因:
|
9月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
9月前
|
算法 NoSQL Java
2021年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)