在中间件,控制器和后台服务之间共享单例

时间:2018-05-18 05:21:03

标签: c# asp.net-core

我是将一些数据放入我的中间件的集合中。我想通过控制器查看此数据。我希望通过后台服务减少此集合中的数据量。

ConfigureServices()中,我将要与控制器,后台服务和中间件共享的Singleton映射。例如:

ConcurrentQueue<string> sharedData = new ConcurrentQueue<string>();
services.AddSingleton(typeof(ConcurrentQueue<string>), sharedData);

这个单例被注入我的控制器和后台服务就好了。有谁知道如何从我的中间件访问这个单例?

1 个答案:

答案 0 :(得分:1)

您的中间件上下文具有IServiceProvider属性RequestServices

e.g。

var queue = context.RequestServices.GetService<ConcurrentQueue<string>>();

此外,正如Tseng所指出的,当使用实现IMiddleware接口的基于工厂的方法时,中间件可以具有构造函数依赖注入。

e.g。

public class ConcurrentQueueMiddleware : IMiddleware
{
    private readonly ConcurrentQueue<string> _queue;

    public ConcurrentQueueMiddleware(ConcurrenQueue<string> queue)
    {
        _queue = queue;
    }

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        // do stuff with your queue

        await next(context);
    }
}

可以在官方Microsoft文档https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/extensibility?view=aspnetcore-2.0

中找到更多信息