ASP.NET Core 高级(三)【使用第三方容器的基于工厂的中间件】

手写ASP.NET Core服务框架:从宿主到中间件的深度实践 ASP.NET Core服务框架的本质是宿主生命周期、中间件委托链与依赖注入容器三大核心机制的协同。其原理在于通过IHostBuilder构建可配置的进程上下文,利用RequestDelegate链式调用实现HTTP请求管道,再依托IServiceProvider完成服务解析与作用域管理。这种设计赋予开发者对启动耗时、中间件执行顺序、DI解析路径等关键环节的完全掌控力,显著提升高并发、低延迟及信创环境下的可观测性与可定制性。本文聚焦于L0宿主层与L1管道层的手动实现,带你穿透Microsoft.Extens 阅读详情

使用 ASP.NET Core 中的第三方容器激活中间件

本文演示如何使用 IMiddlewareFactory 和 IMiddleware 作为使用第三方容器激活中间件的可扩展点。 有关 IMiddlewareFactory 和 IMiddleware 的介绍性信息,请参阅基于工厂的中间件激活主题。

示例应用演示了使用 IMiddlewareFactory、SimpleInjectorMiddlewareFactory 实现激活的中间件。 此示例使用 Simple Injector 依赖项注入 (DI) 容器。

此示例的中间件实现记录了查询字符串参数 (key) 提供的值。 中间件使用插入的数据库上下文(有作用域的服务)将查询字符串值记录在内存中数据库。

此示例应用仅出于演示目的使用 Simple Injector。 不认可使用 Simple Injector。 Simple Injector 文档中描述的中间件激活方法和 Simple Injector 维护人员推荐的 GitHub 问题。 有关详细信息,请参阅 Simple Injector 文档和 Simple Injector GitHub 存储库。

IMiddlewareFactory

IMiddlewareFactory 提供中间件的创建方法。

在示例应用中,实现了中间件工厂以创建 SimpleInjectorActivatedMiddleware 实例。 中间件工厂使用 Simple Injector 容器来解析中间件:

public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
    private readonly Container _container;

    public SimpleInjectorMiddlewareFactory(Container container)
    {
        _container = container;
    }

    public IMiddleware Create(Type middlewareType)
    {
        return _container.GetInstance(middlewareType) as IMiddleware;
    }

    public void Release(IMiddleware middleware)
    {
        // The container is responsible for releasing resources.
    }
}

IMiddleware

IMiddleware 定义应用的请求管道的中间件。

由 IMiddlewareFactory 实现 (Middleware/SimpleInjectorActivatedMiddleware.cs) 激活的中间件:

public class SimpleInjectorActivatedMiddleware : IMiddleware
{
    private readonly AppDbContext _db;

    public SimpleInjectorActivatedMiddleware(AppDbContext db)
    {
        _db = db;
    }

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            _db.Add(new Request()
                {
                    DT = DateTime.UtcNow, 
                    MiddlewareActivation = "SimpleInjectorActivatedMiddleware", 
                    Value = keyValue
                });

            await _db.SaveChangesAsync();
        }

        await next(context);
    }
}

为中间件创建扩展 (Middleware/MiddlewareExtensions.cs):

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
    }
}

Startup.ConfigureServices 必须执行多项任务:

  • 设置 Simple Injector 容器。
  • 注册工厂和中间件。
  • 为 Razor 页面的 Simple Injector 容器创建应用的数据库上下文。
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // Replace the default middleware factory with the 
    // SimpleInjectorMiddlewareFactory.
    services.AddTransient<IMiddlewareFactory>(_ =>
    {
        return new SimpleInjectorMiddlewareFactory(_container);
    });

    // Wrap ASP.NET Core requests in a Simple Injector execution 
    // context.
    services.UseSimpleInjectorAspNetRequestScoping(_container);

    // Provide the database context from the Simple 
    // Injector container whenever it's requested from 
    // the default service container.
    services.AddScoped<AppDbContext>(provider => 
        _container.GetInstance<AppDbContext>());

    _container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

    _container.Register<AppDbContext>(() => 
    {
        var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
        optionsBuilder.UseInMemoryDatabase("InMemoryDb");
        return new AppDbContext(optionsBuilder.Options);
    }, Lifestyle.Scoped);

    _container.Register<SimpleInjectorActivatedMiddleware>();

    _container.Verify();
}

中间件在 Startup.Configure 的请求处理管道中注册:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseSimpleInjectorActivatedMiddleware();

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();
}
.net core 依赖注入(Dependency Injection, DI) 依赖注入(Dependency Injection, 简称 DI) 是 .NET Core 的一个核心特性,广泛应用于 ASP.NET Core 应用程序中,用来构建松耦合、易于扩展和测试的代码。理解和熟练使用依赖注入是 .NET 开发中的一个重要技能。 阅读详情

相关推荐

高级 ASP.NET Core 面试问题终极挑战:从底层原理到实战优化

本文深入探讨ASP.NET Core高级开发技术,涵盖依赖注入、中间件优化、性能调优和安全机制四大核心领域。 关键内容: 依赖注入进阶:解析单例、范围和瞬态服务的生命周期陷阱,提供工厂模式解决方案 中间件优化:演示自定义中间件开发,分享短路逻辑、异步处理等性能优化技巧 性能调优:对比HTTP/1.1、HTTP/2和gRPC协议性能,提供gRPC高吞吐API实现方案 安全机制:详解防篡改JWT认证中间件开发,包括严格令牌验证和异常处理 技术亮点: 12个实战案例覆盖典型场景 从源码层面解析Kestrel线程管

墨夶的博客 590

使用第三方容器服务,自动化部署.Net Core

1.为什么用第三方,而不自建,有哪些第三方,最后实现的效果   a.尝试过自建,并成功了,但是很麻烦,要敲一堆命令,无法达到全自动化部署的要求。   b.自建,就算用第三方的镜像包,感觉下载还是不快,不知道为什么。   哪些:各大云服务好像都已经有了,因为我用的码云做的项目托管,支持码云或者自定义git地址的,只有华为云和daocloud,最后选择的是daocloud。 ...

weixin_30781775的博客 212

从SGX到TDX:英特尔机密计算的技术演进与选型指南

本文深入解析了英特尔两代机密计算技术SGX与TDX的核心差异与选型策略。SGX提供应用级飞地隔离,安全等级高但开发复杂;TDX提供虚拟机级信任域保护,兼容性好且易于部署。文章结合金融与医疗行业实战案例,为开发者提供了清晰的选型指南,帮助根据代码可改性、安全需求、部署规模及生态成本选择最合适的机密计算方案。

java5的博客 420

ASP.NET Core 高级(二)【基于工厂的中间件】

IMiddlewareFactory/IMiddleware 是中间件激活的扩展点。 UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware。 如果是,则使用在容器中注册的 IMiddlewareFactory 实例来解析 IMiddleware 实现,而不使用基于约定的中间件激活逻辑。 中间件在应用的服务容器中注册为作用域或瞬态服务。 优点: 按请求(作用域服...

极客神殿 810

五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器

本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分五个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二: 一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EKF)开发实践之三: 基于三个传感器的海拔高度数据融合 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器 也就是本文 ...

okgwf的博客 4138

保姆级教程:在RK3588开发板上配置USB-C PD充电(基于HUSB311芯片与DTS详解)

本文详细介绍了在RK3588开发板上配置USB-C PD充电的完整流程,重点解析了HUSB311芯片的硬件原理与DTS安全配置。通过实战案例和调试技巧,帮助开发者避免常见错误,实现稳定可靠的Type-C PD快充功能,适用于从基础开发板到工业设备的多场景需求。

weixin_42552315的博客 522

Netcore——Middleware中间件(1)

比如流水线工作每个工人做的事情都很唯一,如果要真正生产出一个手机,要经过每一个工人的处理才能得到一个完整的手机。如果上一个工人对手机做了,一些修改那么这个修改也会保留到下一个工人手中,工人之间共享的是这部手机。ASP.NETCore的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件。中间件按照装配的先后顺序执行,并决定是否进入下一个组件。中间件管道的处理流程如下图。定义一个Middleware的类。if(!}}...

世界既不黑也不白,而是一道精致的灰。 1528

【比较器仿真】

比较器tran noise、pnoise仿真、噪声仿真、MC失调仿真

pickweb的博客 1万+

ASP.NET Core中创建中间件的几种方式

今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为了使其在请求处理管道中能够以灵活和可扩展的方式处理 HTTP 请求和响应。了解现有中间件的顺序,以及在哪里添加自定义中间件。你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。首先我们创建一个自定义中间件类,它将记录每个请求的详细信息。

sdgfafg_25的博客 1935

分布式协作方案:OpenClaw多节点部署与设备互联

主从架构或对等架构服务发现与注册机制负载均衡策略选择分布式任务队列优先级调度失败重试机制WebSocket实时通信数据同步引擎冲突解决策略健康检查机制故障自动转移数据复制与恢复通过分布式部署,OpenClaw可以支撑更大规模的业务场景,提供更稳定可靠的AI助手服务。在下一篇文章中,我们将深入探讨安全与权限管理的精细化策略。

gaoxiang_120的专栏 371

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5190

ASP.NET Core轻松入门之Middleware管道模型

Middleware指的是微软的的asp.net core的管道模型。其原理可以用微软官方的下图展示: 原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方向)每经过一个处理,HttpContext内都会被加入一些东西或者被做一些修改,在每个管道处理完成后,随着Next()传到下一个管道处理。 下面 ,我们在ASP.Net Core应用程序中

码农阿宇 2731

黑猫带你学UFS协议第23篇:UFS固件升级操作详解(FFU)

摘要:本文介绍了UFS固件更新(FFU)的实现方法与注意事项。根据UFS3.1 JEDEC协议,FFU通过write buffer命令(MODE=0Eh)下载FW固件,随后必须进行power cycle或硬件复位生效。文章详细阐述了FFU操作的10条规则,包括数据分片传输要求、寄存器访问限制等,同时指出协议未明确的厂商实现差异。关键寄存器包括bFFUTimeout、bDeviceFFUStatus和fPermanentlyDisableFwUpdate。

黑猫奥利奥的博客 1万+

【ASP.NET Core】ASP.NET Core中间件解析

中间件的本质是一个嵌套的请求委托容器,通过接收下一个中间件的请求委托,返回当前中间件的请求委托。其中这个返回的请求委托中包含了对当前逻辑的执行和对next的调用。多个中间件按注册顺序组成请求管道,请求按注册顺序流经每个节点,响应则按相反顺序回流

Arabys的博客 1375

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

perseverance51博客 5786

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ASP.NET Core中间件解析

中间件是处理HTTP请求和响应的组件,通过请求委托构成执行链。请求按注册顺序流经中间件管道,响应则反向返回。中间件可以在请求和响应阶段分别执行逻辑,或通过短路终止后续处理。ASP.NET Core支持三种中间件定义方式:内联中间件直接编写管道逻辑,类中间件封装复用逻辑,工厂模式中间件可控制生命周期。中间件与过滤器不同,前者是基础请求处理机制,后者专用于MVC/WebAPI的action执行。中间件通过Run、Map和Use方法配置,形成嵌套的请求委托链,实现灵活的请求处理流程。

qq_40098572的博客 1035

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ASP.NET Core 中基于工厂的中间件激活

IMiddlewareFactory/IMiddleware 是中间件激活的扩展点。UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware。如果是,...

dotNET跨平台 256

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ASP.NET Core DI 工厂模式实战指南(高级开发者都在用的设计技巧)

掌握ASP.NET Core DI 的工厂模式,轻松解决复杂服务创建难题。适用于多实例、运行时参数注入等场景,通过工厂模式实现灵活解耦与高效管理。核心方法清晰,提升代码可测试性与扩展性,高级开发者都在用的设计技巧,值得收藏。

PoliVein的博客 1035

从新手到专家:ASP.NET Core工厂模式在DI中的5种高阶应用场景

掌握ASP.NET Core DI 的工厂模式,轻松解决复杂对象创建难题。涵盖服务动态解析、多实例管理、条件注入等5大高阶场景,提升系统灵活性与可维护性。深入讲解实现原理与最佳实践,值得收藏。

LiteCode的博客 992

ASP.NET Core 9.0 精要(三)

自定义中间件允许你封装功能并在应用程序的不同部分重用它。在 ASP.NET Core 9 中创建自定义中间件涉及几个步骤,例如以下内容:中间件类定义Invoke或方法的实现请求管道中的中间件注册contextRequestMethod} }contextRequestPath");contextResponseStatusCode} }这段自定义中间件代码的目的是在请求的开始和响应中向控制台写入一个字符串。:这是一个代表管道中下一个中间件的委托。

龙哥盟 1185

ASP.NET Core 中的延迟注入:原理与实践

延迟注入是 ASP.NET Core 中一种重要的性能优化和资源管理策略,尤其适用于那些创建成本高昂或不总是需要的服务。通过类,我们可以有效地推迟对象的实例化,直到它们真正被使用。虽然 ASP.NET Core 的内置 DI 容器不直接支持Lazy<T>的自动解析,但我们可以通过注册工厂方法或注入来实现这一目标。对于更复杂的场景,或者如果你已经在使用第三方 DI 容器,它们通常会提供更简洁的Lazy<T>解析支持。

喵叔 1064

ASP.NET Core--依赖注入(DI)--在ASP.NET Core中使用依赖注入

在ASP.NET Core中实现依赖注入的第二步是定义服务。服务是应用程序中需要注入到其他组件的对象或类。服务可以是瞬态、作用域或单例的,这取决于它们是如何注册的。创建服务类创建一个类,它实现了某个接口或继承自某个基类。这个类就是你的服务类,它包含了实现逻辑。如果服务类没有对应的接口或基类,也可以直接创建一个类,但最好还是提供一个接口或基类以支持依赖注入的灵活性。定义接口或基类如果你创建了一个服务类,那么应该为它定义一个接口或基类,以便其他组件可以依赖注入这个服务。

风清扬的专栏 1697

你真的会用ASP.NET Core工厂模式吗?这7个高级技巧让你少走三年弯路

掌握ASP.NET Core DI 工厂模式的7个高级技巧,解决服务动态创建难题。涵盖异步初始化、条件注入、作用域管理等核心场景,提升系统灵活性与可维护性,避免常见陷阱,值得收藏。

GatherLume的博客 299

asp.net core

用于创建一个 Web 应用程序的构建器 (WebApplicationBuilder) 实例。通过这个构建器,你可以配置应用程序的服务和中间件,进而构建和运行你的 ASP.NET Core Web 应用。 用于设置Web服务器所监听的URL和端口。通过这个方法,开发者可以指定应用程序在哪些地址和端口上运行,从而控制外部请求如何到达你的应用程序。 允许你访问应用程序的配置设置,这些设置通常包含在 appsettings.json、环境变量、用户机密、命令行参数等中。builder.Configuration

备忘 1400

ASP.NET Core工厂模式深度实践,揭秘大型项目中服务创建的底层逻辑

掌握ASP.NET Core DI 的工厂模式,轻松解决复杂服务创建难题。适用于多租户、动态策略等场景,通过IServiceProvider灵活获取服务实例,提升性能与可维护性。揭秘底层实现机制,值得收藏。

PixelIsle的博客 640

【ASP.NET Core DI 工厂模式深度解析】:掌握高效服务实例化的核心秘诀

掌握ASP.NET Core DI的工厂模式,轻松解决复杂服务实例化难题。适用于多租户、动态配置等场景,通过工厂方法灵活创建服务实例,提升性能与可维护性。详解实现步骤与最佳实践,值得收藏。

DebugVibe的博客 1002
上一篇: ASP.NET Core 高级(二)【基于工厂的中间件】
下一篇: ASP.NET Core 托管和部署(一)【Kestrel】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值