我目前正在将ASP.NET Web Api项目迁移到ASP.NET Core,并且我在如何正确完成存储Configuration属性的值并使配置可供我的整个项目访问方面有点迷失。 / p>
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// invoking a factory to create the service?
services.AddSingleton(_ => Configuration);
services.AddSingleton<IConfiguration>(_ => Configuration);
// passing the instance of the service?
services.AddSingleton(Configuration);
services.AddSingleton<IConfigurationRoot>(Configuration);
}
我仍然没有编译所有内容,因为我仍然需要更多地去迁移其余的代码,所以我甚至不确定底部的两个是否有效。
我没有找到关于这些不同实现的明确文档,特别是最后两个,有人可以帮助解释这些差异吗?
答案 0 :(得分:4)
不同之处在于,当您使用&#34; factory&#34;时,每次请求实例时都会调用它。它本质上是一个&#34;描述&#34;对于你想要如何构建的东西,如果你在运行时需要一些东西来竞争实例,这可以派上用场。
在你的情况下,你对配置一无所知,所以最好只绑定为Singleton。但请考虑以下因素:
services.AddTransient(_ =>
{
//Now I can do work in here at runtime to work out WHICH instance I should return
//For example at runtime I could decide should I return configuration from appSettings.json or somewhere else?
//Then I can return the one that I actually want to use.
return Configuration;
});
应该注意的是,因为你使用的是Singletons,所以两者之间的区别很小,因为它只会被调用一次,但是对于Transient / Scoped依赖,可能会有很大的不同。
另一方面,如果您对配置部分感到困惑。请快速阅读:http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/