Asp.net core 如何使用中间件<;类型>;(…)和传入选项?

Asp.net core 如何使用中间件<;类型>;(…)和传入选项?,asp.net-core,Asp.net Core,我试图了解ASP.NET核心管道是如何工作的。我想使用StaticFileMiddleware并传入一些选项 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var staticFileOptions = new StaticFileOptions(); app.UseMiddleware<Microsoft.Asp

我试图了解ASP.NET核心管道是如何工作的。我想使用
StaticFileMiddleware
并传入一些选项

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    var staticFileOptions = new StaticFileOptions();
    app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(staticFileOptions);
}
但是,由于这是一个学习练习,我想用另一种方式来称呼它。

而不是

app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(staticFileOptions);
app.UseMiddleware(staticFileOptions);
使用

app.use中间件(Microsoft.Extensions.Options.Options.Create(staticFileOptions));
(或将
Microsoft.Extensions.Options
粘贴为使用和调用
Options.Create


这是根据您的错误在

中实现UseStaticFiles的方式

System.InvalidOperationException:找不到类型为“Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware”的合适构造函数确保类型是具体的,并且服务注册为公共构造函数的所有参数


添加公共构造函数或您的构造函数是私有的

这是我解决相同问题的方法

只需使用要传递的属性创建新类:

public class LoggingOption
{
    public bool ToLog { get; set; }
}
这就是初始化的方法

app.UseMiddleware<LoggingMiddleware>(Options.Create(new LoggingOption{ ToLog = true }));
app.useMidleware(Options.Create(newloggingOption{ToLog=true}));
这是构造器

 public LoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<LoggingOption> options)
        {
            _next = next;
            _logger = loggerFactory.CreateLogger<LoggingMiddleware>();
            _toLog = options.Value.ToLog;
        }
public logging中间件(RequestDelegate-next、ILoggerFactory-loggerFactory、IOptions选项)
{
_下一个=下一个;
_logger=loggerFactory.CreateLogger();
_toLog=options.Value.toLog;
}

大多数中间件实际上不仅将其选项作为纯类本身,例如在您的案例中
StaticFileOptions
,而是将其包装在
IOptions
配置界面中作为
IOptions

幸运的是,有一种很好的方法可供您使用。因此,您可以将Microsoft.Extensions.Options.Options.Create(staticFileOptions)的返回值传递到
UseMediddleware
调用中


必须包装内部IOption可能看起来是多余的,等等,但它也有好处,例如在配置源(文件系统、Azure应用程序配置等)更改时自动重新加载值。

这是一个更好的答案:这实际上是错误的。此错误与是否具有公共构造函数无关。如果找不到匹配的构造函数,或者至少有一个构造函数作为参数所需的服务无法找到,则会引发此错误—实际上是这样!我就是这样!
public class LoggingOption
{
    public bool ToLog { get; set; }
}
app.UseMiddleware<LoggingMiddleware>(Options.Create(new LoggingOption{ ToLog = true }));
 public LoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<LoggingOption> options)
        {
            _next = next;
            _logger = loggerFactory.CreateLogger<LoggingMiddleware>();
            _toLog = options.Value.ToLog;
        }