.NET Core 2 & DI - использовать значения из appsettings.json в конструкторе? - PullRequest
0 голосов
/ 24 мая 2018

как использовать параметры конструктора, значения которых хранятся в appsettings.json?

services.AddTransient<IService, Service>(x => new Service("arg1", "arg2"));

Я использую интерфейс IOptions для чтения значений моей конфигурации

services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Если используется IOptions<T>, тогда обновите конструктор Service, чтобы он явно зависел от IOptions<MyOptions>, чтобы его можно было внедрить в класс.

public class Service: IService {    
    public Service(IOptions<MyOptions> options) {
        this.arg1 = options.Value.arg1;
        this.arg2 = options.Value.arg2;
    }
}

Конфигурация может быть упрощена до

services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
services.AddTransient<IService, Service>();

Предполагается, что appsettings.json содержит

{
   "MyOptions": {
       "arg1": value1,
       "arg2": value2
    }
}

Если невозможно изменить конструктор класса обслуживания, разрешите параметр в делегате фабрики объектов

services.AddTransient<IService, Service>(serviceProvider => {
    var options = serviceProvider.GetService<IOptions<MyOptions>>();
    return new Service(options.Value.arg1, options.Value.arg2);
});

Ссылка Шаблон настроек в ASP.NET Core

0 голосов
/ 24 мая 2018

Параметр в лямбда-выражении для той перегрузки AddTransient, которую вы используете, на самом деле является экземпляром IServiceProvider.Это означает, что вы можете просто сделать:

services.AddTransient<IService, Service>(p => {
    var options = p.GetRequiredService<MyOptions>();
    return new Service(options.arg1, options.arg2);
});
0 голосов
/ 24 мая 2018

Вы можете получить значения из appsettings.json с интерфейсом IConfiguration для фреймворков.

Допустим, ваш json равен

{
   "argSection": 
    {
       "arg1": 1,
       "arg2": 2
    }
}

Затем прочитайте значения, подобные этому

services.AddTransient<IService, Service>(x => new Service(Configuration["argSection:arg1"], Configuration["argSection:arg2"]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...