访问自定义中间件在ConfigureServices中注入的参数



我正在练习学习更多关于ASP中的依赖注入和中间件的知识。. NET Core和我遇到了一个无法解决的问题,所以需要StackOverflow的其他成员的帮助。

在我的项目中,我试图创建一个中间件,它将一些初始数据与运行时收集的另一个数据相结合。

我有以下类作为初始数据

public class A
{
public string Name { get; set; }
public string Description { get; set; }
}

我为依赖注入创建了以下类

namespace Microsoft.Extensions.DependencyInjection
{
public static class MiddlewareInitialDataExtension
{
public static IServiceCollection AddInitialData(this IServiceCollection services, Action<A> data)
{
A a = new A();
data(a);
return services.AddSingleton<A>(a);
}    
}
}

Startup.cs文件中,我按如下方式注入它:

public void ConfigureServices(IServiceCollection services)
{
services.AddInitialData(d =>
{
d.Name = "Some name";
d.Description = "Some description";
});
}

我也写了我的中间件如下:

public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
this._next = next;
}
public async Task Invoke(HttpContext context)
{
await this._next(context);
}
}

并在Starup.cs文件中注册我的中间件,如下所示:

public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
app.UseMiddleware(typeof(MyMiddleware));
}

此时,我需要访问从A类实例化的对象,并在调用Invoke(HttpContext context)方法时注入到应用程序中。

到目前为止,我已经找到了一些使用依赖注入的不同方式的例子,例如将对象(从类a)传递给中间件的构造函数,但相反,我想读取对象的值设置为写入。

在启动时注册了A实例,可以将其添加到中间件构造函数中的签名中:

private readonly A _a;
public MyMiddleware(RequestDelegate next, A instanceOfA)
{
_a = instanceOfA;
}
public async Task Invoke(HttpContext context)
{
Console.WriteLine(_a.Name); // should print "Some name"
await this._next(context);
}

您可以将您喜欢的任何参数传递给Invoke方法,DI将负责注入。第一个参数应该是HttpContext

public MyMiddleware(RequestDelegate next)
public async Task InvokeAsync(HttpContext context, A theA)

如果你想在构造函数中传递参数,那么你必须使用基于工厂的中间件

public MyMiddleware(A theA)
public async Task InvokeAsync(HttpContext context, RequestDelegate next)

相关内容

  • 没有找到相关文章

最新更新