我是将一些数据放入我的中间件的集合中。我想通过控制器查看此数据。我希望通过后台服务减少此集合中的数据量。
在ConfigureServices()
中,我将要与控制器,后台服务和中间件共享的Singleton映射。例如:
ConcurrentQueue<string> sharedData = new ConcurrentQueue<string>();
services.AddSingleton(typeof(ConcurrentQueue<string>), sharedData);
这个单例被注入我的控制器和后台服务就好了。有谁知道如何从我的中间件访问这个单例?
答案 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
中找到更多信息