ASP.NET核心依赖注入:工厂和实例之间的区别?

时间:2017-01-18 09:14:46

标签: c# asp.net-web-api asp.net-core

我目前正在将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);
}

我仍然没有编译所有内容,因为我仍然需要更多地去迁移其余的代码,所以我甚至不确定底部的两个是否有效。

我没有找到关于这些不同实现的明确文档,特别是最后两个,有人可以帮助解释这些差异吗?

1 个答案:

答案 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/