首页 > 其他分享 >在中间件中使用 Scoped 模式服务

在中间件中使用 Scoped 模式服务

时间:2023-12-06 17:36:07浏览次数:31  
标签:服务 Scoped 作用域 中间件 模式 next 实例 context 请求

作用域(Scoped)服务和瞬时(Transient)服务都与请求的生命周期相关,但它们之间有一些区别。

1. 作用域(Scoped)服务:
- 作用域服务的生命周期与每个请求的生命周期相对应。也就是说,每个请求都会创建一个作用域服务的实例,并且在请求处理过程结束时该实例将被释放。
- 作用域服务在同一个请求中是共享的,但在不同请求之间是隔离的。也就是说,每个请求都会获得一个独立的作用域服务实例,不同请求之间的作用域服务实例是相互独立的。
- 作用域服务适合在请求处理过程中需要保持状态或跟踪请求特定数据的情况。

2. 瞬时(Transient)服务:
- 瞬时服务的生命周期是短暂的,每次使用时都会创建一个新的实例。
- 瞬时服务在每次请求中都会创建一个新的实例,不会共享实例。
- 瞬时服务适合那些不需要保持状态或跟踪请求特定数据的情况,每次使用时都需要一个新的实例。

总的来说,作用域服务和瞬时服务都与请求的生命周期相关,但作用域服务在同一个请求中是共享的,而瞬时服务在每次使用时都会创建一个新的实例。

在ASP.NET Core中,您可以使用`AddScoped`方法将服务注册为作用域服务,使用`AddTransient`方法将服务注册为瞬时服务。

app.Run(async (context) =>
            {
                // 获取作用域服务
                var scopedService1 = context.RequestServices.GetService<ScopedService>();
                var scopedService2 = context.RequestServices.GetService<ScopedService>();

                // 获取瞬时服务
                var transientService1 = context.RequestServices.GetService<TransientService>();
                var transientService2 = context.RequestServices.GetService<TransientService>();

                // 打印服务实例的 ID
                await context.Response.WriteAsync($"Scoped Service 1: {scopedService1.Id}\n");
                await context.Response.WriteAsync($"Scoped Service 2: {scopedService2.Id}\n");
                await context.Response.WriteAsync($"Transient Service 1: {transientService1.Id}\n");
                await context.Response.WriteAsync($"Transient Service 2: {transientService2.Id}\n");
            });

  

方法一:使用IServiceProvider创建Scope重新获得新的Service

    public class TestMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly IServiceProvider _serviceProvider;

        public TestMiddleware(RequestDelegate next, IServiceProvider serviceProvider)
        {
            _next = next;
            _serviceProvider = serviceProvider;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            _serviceProvider.CreateScope().ServiceProvider?.GetService<ITestService>()?.GetTest();
            Console.WriteLine(context.Connection?.RemoteIpAddress?.ToString());
            await _next.Invoke(context);
        }
    }
View Code

注入:

app.UseMiddleware<TestMiddleware>();//添加中间件
View Code

 

方法二:使用继承 IMiddleware接口方法

public class TestMiddleware : IMiddleware
{
private readonly ITestService _testService;
public TestMiddleware(ITestService testService)
{

_testService = testService;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
_testService.Test();
Console.WriteLine(context.Connection?.RemoteIpAddress?.ToString());
await next(context);
}
}
View Code

注入:

//添加中间件
builder.Services.AddTransient<TestMiddleware>();
app.UseMiddleware<TestMiddleware>();
View Code

 

标签:服务,Scoped,作用域,中间件,模式,next,实例,context,请求
From: https://www.cnblogs.com/yexiaoyanzi/p/17880022.html

相关文章

  • 进一步探索智慧医疗新模式,圆心科技上市前景广阔
    在政策、监管的多方推动下,我国智慧医疗形势一片大好,数据显示,2022年我国智医疗应用规模约为780.5亿元,到2023年国内智慧医疗应用规模可达到936.6亿元,未来市场份额也将进一步扩已经成为了众多资本眼中的香饽饽。不久前,我国知名医疗健康公司北京圆心科技就完成了多轮融资,为其赴......
  • VMware桥接模式设置Ubuntu 22固定IP
    Ubuntu22桥接模式下面设置固定IP1、进入netplan网络配置目录cd/etc/netplan修改sudovim00-network-manager-all.yaml我的文件是:01-network-manager-all.yaml2、查看主机的网络信息Windows系统ipconfigLinux系统ifconfig例如主机网络信息: 3、修改配置......
  • 单例模式
    创建单例模式importthreadingimporttimeclassSingleton:instance=None#加锁是为了当多线程调用时,防止出现多线程执行太快都去新建了一个对象,这就违背了单例模式的意义lock=threading.RLock()def__init__(self,name):self.name=nam......
  • 深入理解和实现Qt中的单例模式
    在Qt框架中,单例模式的实现是一个常见的需求,它有多种实现方式,每种都有其特点。以下是对这些方法的探讨,包括宏定义方式、模板类方式,以及Qt的内置单例宏,并附有具体的使用示例。宏定义方式的单例模式宏定义方式是一种传统且直接的实现单例模式的方法,但它可能导致代码重复和类型安全......
  • 小谈设计模式(12)—迪米特法则
    (小谈设计模式(12)—迪米特法则)专栏介绍专栏地址http://t.csdnimg.cn/VpriY专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。迪米特法则迪米特法则(LawofDemeter)......
  • 敏捷:应对软件定义汽车时代的开发模式变革
    ​随着软件定义汽车典型应用场景的落地,汽车从交通工具转向智能移动终端的趋势愈发明显。几十年前,一台好车的定义主要取决于高性能的底盘操稳与动力系统;几年前,一台好车的定义主要取决于智能化系统与智能交互能否满足终端用户的用车体验;相信不久后的将来,一台好车的定义将变成:全车传......
  • 第三单元 管道与中间件
    1.什么是中间件在ASP.NETCore中,中间件(Middleware)是一个可以处理HTTP请求或响应的软件管道。ASP.NETCore中给中间件组件的定位是具有非常特定的用途。例如,我们可能有需要一个中间件组件验证用户,另一个中间件来处理错误,另一个中间件来提供静态文件,如JavaScript文件,CSS文件,图......
  • 设计模式(十六)迭代器
    一、定义提供一种方法顺序访问一个聚合对象中的各个元素,且不用暴露该对象的内部表示。迭代器模式是一种对象行为型模式,又称为游标(Cursor)模式。二、描述在软件系统中,聚合对象拥有两个职责:一是存储数据,二是遍历数据。从依赖性来看,前者是聚合对象的基本职责,而后者既是可变化的,又是......
  • 企业集成模式
    资料作者网站https://www.enterpriseintegrationpatterns.com/patterns/messaging/【金山文档】企业集成模式https://kdocs.cn/l/cfbM5BO6gyYj书第10页SpringIntegrationSpring集成框架概述作为Spring编程模型的延伸,SpringIntegration提供了各种配置选项,包括注......
  • 使用Python代码识别股票价格图表模式
    在股票市场交易的动态环境中,技术和金融的融合催生了分析市场趋势和预测未来价格走势的先进方法。本文将使用Python进行股票模式识别。fromcollectionsimportdefaultdictimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromscipy.signalim......