2017-01-18 2 views
2

В настоящее время я переношу проект ASP.NET Web Api в ASP.NET Core, и я немного потерял информацию о том, как правильно выполнить сохранение значения свойства Configuration и сделать конфигурацию доступной для всего моего проекта.Инъекция зависимостей ядра ASP.NET: разница между фабрикой и экземпляром?

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

Hi Factory используется в том случае, если вы не хотите создавать экземпляр нескольких раз, и этот объект зависит от многих других других сервисов. Но в вашем случае это один класс, и вы не собираетесь издеваться над конфигурацией для тестирования, поэтому нет смысла использовать его как фабрику. Вы должны пойти за DI. –

+0

, пожалуйста, прочитайте больше здесь: - http://dotnetliberty.com/index.php/2016/05/09/asp-net-core-factory-pattern-dependency-injection/ –

+0

@YashveerSingh, Спасибо за ссылку. Тем не менее, я до сих пор неясно о разнице между использованием «Func» лямбды против передачи экземпляра. – Svek

ответ

4

Разница заключается в том, что при использовании «фабрики» он вызывается каждый раз, когда запрашивается экземпляр. По сути, это «описание» того, как вы хотите, чтобы все было построено, это может пригодиться, если вам нужно что-то во время выполнения для компиляции экземпляра.

В вашем случае вы ничего не делаете с конфигурацией, поэтому лучше просто привязываться как 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; 
}); 

Следует отметить, что, поскольку вы используете синглтонов, там будет очень мало разницы между ними, так как это только будет вызываться один раз в любом случае, но с Transient/контекстными зависимостями могут быть большие различия.

С другой стороны, если вы путаетесь с разделами конфигурации. Прочтите здесь: http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

+0

Этот ответ имеет большой смысл. Я ценю ясность. – Svek

Смежные вопросы