C# 调用时访问中间件选项
我正在创建一个自定义中间件元素,但不知道如何将Options对象传递给中间件并在Invoke方法中访问它们 配置: 分机:C# 调用时访问中间件选项,c#,asp.net-core,C#,Asp.net Core,我正在创建一个自定义中间件元素,但不知道如何将Options对象传递给中间件并在Invoke方法中访问它们 配置: 分机: 结果发现我使用了错误的方法来添加中间件 更改为将中间件添加到ApplicationBuilder中,并使用UseMediddleware,它无法按照我的要求获取选项 分机: MiddleConfig: 我不明白你有什么问题。您正在通过构造函数传递选项,并将其存储在实例变量中,这样您就可以在Invoke方法中访问该变量。@Stijn这样做是吗?难道不可能以某种方式获得构造函数
结果发现我使用了错误的方法来添加中间件 更改为将中间件添加到ApplicationBuilder中,并使用UseMediddleware,它无法按照我的要求获取选项 分机: MiddleConfig:
我不明白你有什么问题。您正在通过构造函数传递选项,并将其存储在实例变量中,这样您就可以在Invoke方法中访问该变量。@Stijn这样做是吗?难道不可能以某种方式获得构造函数中的值吗?我的小中间件的构造函数接受两个参数,RequestDelegate和MiddleConfig。我不能从中间启动一个对象,因为我不能提供requestdelegates。你想自己构造一个中间实例吗?不管怎样,我想我现在理解了您的问题:您没有在DI容器中注册opt,所以在中间件中_opt为null或崩溃,对吗?看一看,可能也会对你有用。
public class MiddleConfig
{
private readonly ICollection<string> _c;
public MiddleConfig()
{
_c = new Collection<string>();
}
public void AddPath(string path)
{
_c.Add(path);
}
public IEnumerable<string> Paths => _c;
}
public class Middle
{
private readonly RequestDelegate _next;
private readonly MiddleConfig _opt = new MiddleConfig();
public Middle(RequestDelegate next, MiddleConfig options)
{
_opt = options;
_next = next;
}
public async Task Invoke(HttpContext context)
{
await _next.Invoke(context);
}
}
public static IServiceCollection AddLCPathControl(this IServiceCollection services, Action<MiddleConfig> options)
{
MiddleConfig opt = new MiddleConfig();
options.Invoke(opt);
return services.AddScoped<Middle>();
}
public static class IServiceCollectionExtension
{
public static IApplicationBuilder UseLCPathControl(this IApplicationBuilder services, string path)
{
return services.UseLCPathControl(o => o.AddPath(path));
}
public static IApplicationBuilder UseLCPathControl(this IApplicationBuilder builder, Action<MiddleConfig> options)
{
MiddleConfig opt = new MiddleConfig();
options.Invoke(opt);
return builder.UseMiddleware<Middle>(opt);
}
}
public class Middle
{
private readonly RequestDelegate _next;
private readonly MiddleConfig _opt = new MiddleConfig();
public Middle(RequestDelegate next, MiddleConfig options)
{
_opt = options;
_next = next;
}
public async Task Invoke(HttpContext context)
{
await _next.Invoke(context);
}
}
public class MiddleConfig
{
private readonly ICollection<string> _c;
public MiddleConfig()
{
_c = new Collection<string>();
}
public void AddPath(string path)
{
_c.Add(path);
}
public IEnumerable<string> Paths => _c;
}