首页 > 其他分享 >.NET Core 注入依赖

.NET Core 注入依赖

时间:2024-12-31 13:07:53浏览次数:5  
标签:Core 依赖 请求 中间件 NET public 注入

.NET Core 是一个现代化的、跨平台的框架,提供了构建高性能和可扩展应用程序的工具。依赖注入(Dependency Injection,DI)和中间件(Middleware)是 .NET Core 框架中两个核心的概念,它们在应用程序的架构中扮演着关键的角色。本文将详细探讨这两个概念,并展示如何在 .NET Core 应用程序中有效使用它们。

1. 依赖注入(Dependency Injection)
依赖注入是一种设计模式,用于将对象的依赖关系从外部传递给它,而不是在内部创建这些依赖。这种模式提高了代码的可测试性和可维护性。在 .NET Core 中,依赖注入是框架的内置功能,几乎所有的 .NET Core 应用程序都会用到它。

1.1 依赖注入的类型
在 .NET Core 中,有三种主要的依赖注入生命周期:

瞬态(Transient): 每次请求都会创建一个新的实例。适用于轻量级、无状态的服务。
作用域(Scoped): 在每个请求范围内创建一次实例。适用于需要在单个请求中共享数据的服务。
单例(Singleton): 在应用程序生命周期内只创建一次实例。适用于全局共享的服务,如缓存管理。
1.2 如何配置依赖注入
在 .NET Core 中,通过 Startup 类中的 ConfigureServices 方法来注册依赖关系。例如:

public void ConfigureServices(IServiceCollection services)
{
    // 注册一个瞬态服务,每次请求都会创建一个新的实例
    services.AddTransient<IMyTransientService, MyTransientService>();
    
    // 注册一个作用域服务,在每个请求范围内创建一次实例
    services.AddScoped<IMyScopedService, MyScopedService>();
    
    // 注册一个单例服务,在整个应用程序生命周期内只创建一次实例
    services.AddSingleton<IMySingletonService, MySingletonService>();
}

上面的代码展示了如何注册不同生命周期的服务。

1.3 使用依赖注入

一旦服务被注册,它们就可以通过构造函数注入到控制器或其他服务中:

public class MyController : ControllerBase
{
    private readonly IMyTransientService _transientService;
    private readonly IMyScopedService _scopedService;
    private readonly IMySingletonService _singletonService;

    // 通过构造函数注入服务依赖项
    public MyController(IMyTransientService transientService,
                        IMyScopedService scopedService,
                        IMySingletonService singletonService)
    {
        _transientService = transientService;
        _scopedService = scopedService;
        _singletonService = singletonService;
    }

    // 你可以在控制器的方法中使用注入的服务
    public IActionResult MyAction()
    {
        _transientService.DoWork();
        _scopedService.DoWork();
        _singletonService.DoWork();

        return Ok();
    }
}

2. 中间件(Middleware)
中间件是处理 HTTP 请求和响应的组件链。在 .NET Core 中,每个请求都会通过一系列的中间件,最终返回响应。中间件的顺序非常重要,因为它决定了请求如何被处理。

2.1 中间件的类型
常见的中间件类型包括:

日志记录中间件: 记录请求和响应的数据。
身份验证中间件: 验证用户身份。
路由中间件: 将请求路由到相应的控制器。
2.2 配置中间件
在 Startup 类的 Configure 方法中配置中间件。例如:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 在开发环境中使用开发者异常页面中间件,以便调试错误
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 添加路由中间件,开始处理路由
    app.UseRouting();

    // 添加身份验证中间件,用于处理用户身份验证
    app.UseAuthentication();
    
    // 添加授权中间件,用于处理用户权限验证
    app.UseAuthorization();

    // 配置终结点路由,映射控制器路由
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

上面的代码展示了一个典型的中间件配置,其中包括异常处理、路由、身份验证和授权等中间件。

2.3 自定义中间件

除了使用内置中间件,.NET Core 还允许开发者创建自定义中间件。例如:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    // 构造函数中注入 RequestDelegate,用于调用下一个中间件
    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // 中间件的核心方法,处理传入的 HTTP 请求
    public async Task InvokeAsync(HttpContext context)
    {
        // 在请求进入下一个中间件之前的处理逻辑
        // 例如:日志记录、请求修改等
        
        await _next(context); // 调用下一个中间件

        // 在请求返回之前的处理逻辑
        // 例如:修改响应、记录响应等
    }
}

public void Configure(IApplicationBuilder app)
{
    // 在请求处理中添加自定义中间件
    app.UseMiddleware<CustomMiddleware>();
}

这个自定义中间件会在请求进入下一个中间件之前和响应返回之前进行处理。

3. 依赖注入与中间件的结合

在实际开发中,依赖注入和中间件通常会结合使用。中间件可以通过构造函数注入服务,以便在处理请求和响应时使用。例如:

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<LoggingMiddleware> _logger;

    // 通过构造函数注入日志服务和下一个中间件委托
    public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    // 中间件的核心方法
    public async Task InvokeAsync(HttpContext context)
    {
        // 使用注入的日志服务记录请求信息
        _logger.LogInformation("Processing request: " + context.Request.Path);
        
        await _next(context); // 调用下一个中间件
    }
}

上面的代码展示了一个简单的日志中间件,它使用依赖注入的 ILogger 服务来记录请求信息。

4. 总结
依赖注入和中间件是 .NET Core 应用程序中不可或缺的组成部分。依赖注入提高了代码的可维护性和可测试性,而中间件则提供了一个灵活的方式来处理 HTTP 请求。通过正确地理解和使用这两个概念,开发者可以构建出更稳定、易于维护的应用程序。

标签:Core,依赖,请求,中间件,NET,public,注入
From: https://www.cnblogs.com/flydmxy/p/18643748

相关文章

  • .net6 WebApi 使用特性实现自动依赖注入
    首先搞三个特性类///<summary>///作用域///</summary>[AttributeUsage(AttributeTargets.Class)]publicclassDiScopedAttribute:Attribute{}///<summary>///单例///</summary>[AttributeUsage(AttributeTargets.Class)]publicclassDiSing......
  • SpringBoot依赖注入完成后执行方法
    引入注解@PostConstruct注解说明1、@PostConstruct是Java中的一个注解,用于标记那些在依赖注入完成后需要执行的方法。它是Java的标准注解之一,定义在javax.annotation.PostConstruct包中。这个注解主要用于执行一些初始化操作,比如创建或初始化对象的内部状态。2......
  • Kubernetes iptables与IPVS 负载均衡模式对比
    Kubernetes可以使用iptables或IPVS作为其服务负载均衡模式。两者有各自的特点和适用场景。以下是对它们的比较和选择建议:1.iptables模式特点基于规则匹配:iptables是基于链表结构的包过滤和NAT实现方式。每个请求都会逐条匹配规则,直到找到匹配项。易用性:适合......
  • 记一次 .NET某汗液测试机系统 崩溃分析
    一:背景1.讲故事上个月在社区写的文章比较少,一直关注的朋友应该知道那段时间被狗咬了以及一些琐事处理,所以手头上也攒了不少需要分享的案例,这段时间比较空闲,逐个给大家做个分享吧,刚好年后为新版的.NET高级调试训练营做案例储备,所以抓紧时间疯狂输出吧!这次生产事故的dump是训......
  • Vue是怎样依赖收集的?
    Vue的依赖收集是Vue实现响应式数据绑定的核心机制之一。在Vue中,当组件初始化时,Vue会对组件的data进行初始化,将普通的JavaScript对象转换成响应式对象。这个过程中,Vue会进行依赖收集,以便在数据发生变化时能够通知到所有依赖这个数据的地方。以下是Vue依赖收集的主要步骤和原理:De......
  • .NET 9 new features-分布式追踪支持、HTTP/3 改进以及更好的容器镜像支持
    .NET9针对云原生开发进行了显著优化,重点改进了分布式追踪、HTTP/3支持和容器镜像优化等方面。这些特性极大地提升了.NET在现代云原生应用中的适配性与开发效率。1.设计原理1.1分布式追踪支持背景:在云原生架构中,应用程序通常由多个微服务组成。分布式追踪能够帮助开发者......
  • .NET周刊【12月第4期 2024-12-22】
    国内文章dotnet简单使用ICU库进行分词和分行https://www.cnblogs.com/lindexi/p/18622917本文将和大家介绍如何使用ICU库进行文本的分词和分行。dotnet简单聊聊Skia里的SKFontMetrics的各项属性作用https://www.cnblogs.com/lindexi/p/18621674本文将和大家简单聊......
  • dotnet最小webApi开发实践
    dotnet最小webApi开发实践软件开发过程中,经常需要写一些功能验证代码。通常是创建一个console程序来验证测试,但黑呼呼的方脑袋界面,实在是不讨人喜欢。Web开发目前已是网络世界中的主流,微软在asp.net框架大行其道之下,也整了个最小webapi项目开发向导。今天,我也拥抱一下新的开发......
  • Log4net自定义配置说明及排错方法
    1、日志记录到数据库时,如对应日志表无日志,可通过如下方式排查:      A、检查数据库的连接事件日志,如无任何事件,则表明数据库连接失败,这时需要排查log4net.config的配置;如有事件,则将对应InsertSql直接在数据库内执行,排查对应SQL错误即可。      B、在AspnetCore中......
  • C#/.NET/.NET Core技术前沿周刊 | 第 19 期(2024年12.23-12.29)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等。......