配置中间件选项

时间:2017-02-28 09:56:30

标签: asp.net-core middleware options

查看不同的库甚至Microsoft代码,我注意到在代码中配置选项的两种不同方式:

ConfigureServices

可以在注册DependencyInjection

时完成
services.AddMvc(options => { });

Configure

app.UseStaticFiles(
     new StaticFileOptions
     {
        ServeUnknownFileTypes = true
     });

我试图找出,哪种方式用于哪个目的但仍然不知道,假设创建自己的中间件并注册DI和使用。

1 个答案:

答案 0 :(得分:1)

您找到的有趣问题。

查看源代码我发现了以下内容:

所有中间件注册都是此UseMiddleware函数的重载,这是IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);的重载。

在这些重载中,您可以为中间件指定硬件自己的参数。假设构造函数中有一些字符串,DI容器将无法解决此问题。

如果未设置参数,则会回退到IServiceProvider以解析特定类型。请参阅扩展类:Microsoft.Extensions.Internal.ActivatorUtilities(内部:Microsoft.AspNetCore.Http.Abstractions.dll

提示

至于最佳实践,请考虑以下事项(我的观点):

  • 尽量避免在构造函数中使用简单类型,但使用Options类。
  • 对于IOptions使用services.Configure<>(),您可以在此处指定ConfigSection =&gt;中的选项。 AppSettings的。
  • 至于服务:请注意中间件是单身人士!所以添加一个瞬态服务,只能为这个中间件解决一次!

我认为最佳做法是:在启动时在IOC中注册中间件及其依赖项作为单例。然后自己解决它并使用方法App.Use([yourDelegate])自行添加。

这种方法的优点是比使用隐藏的微软代码更容易理解+微软最近发布了对DI容器的升级,以检查你的注册范围是否匹配正确(如果没有,则发出警告)。

这个工具基本上做了:它检查服务的依赖关系是否具有比服务本身更小的范围:说服务是范围:Singleton,依赖关系是范围Transient。这意味着,如果Singleton已解决,Transient也会针对此单例进行解析,因此在下次使用此单例时不会再次解析。 (所以它是一个隐藏的单例用法)。