查看不同的库甚至Microsoft代码,我注意到在代码中配置选项的两种不同方式:
在ConfigureServices
中可以在注册DependencyInjection
:
services.AddMvc(options => { });
或Configure
app.UseStaticFiles(
new StaticFileOptions
{
ServeUnknownFileTypes = true
});
我试图找出,哪种方式用于哪个目的但仍然不知道,假设创建自己的中间件并注册DI和使用。
答案 0 :(得分:1)
您找到的有趣问题。
查看源代码我发现了以下内容:
所有中间件注册都是此UseMiddleware函数的重载,这是IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);
的重载。
在这些重载中,您可以为中间件指定硬件自己的参数。假设构造函数中有一些字符串,DI容器将无法解决此问题。
如果未设置参数,则会回退到IServiceProvider
以解析特定类型。请参阅扩展类:Microsoft.Extensions.Internal.ActivatorUtilities
(内部:Microsoft.AspNetCore.Http.Abstractions.dll
)
至于最佳实践,请考虑以下事项(我的观点):
services.Configure<>()
,您可以在此处指定ConfigSection =&gt;中的选项。 AppSettings的。我认为最佳做法是:在启动时在IOC中注册中间件及其依赖项作为单例。然后自己解决它并使用方法App.Use([yourDelegate])
自行添加。
这种方法的优点是比使用隐藏的微软代码更容易理解+微软最近发布了对DI容器的升级,以检查你的注册范围是否匹配正确(如果没有,则发出警告)。
这个工具基本上做了:它检查服务的依赖关系是否具有比服务本身更小的范围:说服务是范围:Singleton
,依赖关系是范围Transient
。这意味着,如果Singleton
已解决,Transient
也会针对此单例进行解析,因此在下次使用此单例时不会再次解析。 (所以它是一个隐藏的单例用法)。