Использование параметров конфигурации во вложенных классах - PullRequest
0 голосов
/ 07 февраля 2019

Когда у меня есть вложенные классы, в которых детям нужны некоторые параметры конфигурации (т. Е. Параметры, записанные в appsettings.json), нужно ли мне создать ретранслятор для передачи конфигурации дочерним классам?

НадеюсьНе думаю, что приведенный ниже пример является разумным способом.Есть ли лучшая практика?

Startup.cs

public Startup(IConfiguration configuration, ...)
    {
        ...
        this.Configuration = configuration;
        ...
    }

Parent.cs

public class Parent
{
    public Parent(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    private IConfiguration _configuration;
    private ChildOne _childOne;
    private ChildTwo _childTwo;

    public void InitializeChildren()
    {
        _childOne = new ChildOne(_configuration);
        _childTwo = new ChildTwo(_configuration);
    }
}

ChildOne.cs

public class ChildOne{
    public ChildOne(IConfiguration configuration){
        _propOne = configuration.GetSection("brahbrah").Value;
    }

    private string _propOne;
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Используйте внедрение зависимости для ваших услуг, а не для ваших моделей.Модели не должны иметь никакой логики или регистрации услуг.

Если вы говорите о служебных классах, они обычно являются частью DI.Вы можете зарегистрировать их в DI, чтобы DI автоматически разрешал службы при создании экземпляра.

Для экземпляра,

public class Parent
{
    public Parent(IConfiguration configuration, ChildOne childOne, ChildTwo childTwo)
    {
        _configuration = configuration;
        _childOne = childOne;
        _childTwo = childTwo;
    }

    private IConfiguration _configuration;
    private ChildOne _childOne;
    private ChildTwo _childTwo;

}

Если вам нужно инициализировать ChildOne и ChildTwo самостоятельно, то вам необходимо передать параметр IConfiguration или хотя бы IServiceProvider для разрешения требуемой службы (служб)

0 голосов
/ 07 февраля 2019

Доменные объекты / модели - не более чем контейнеры данных.Эти контейнеры данных могут нуждаться в данных, но они не должны зависеть от внедрения зависимостей (напрямую) для этих данных, поскольку они лежат в основе вашего приложения.Изменение вашей модели (или ее зависимостей), скорее всего, приведет к большим изменениям.

Как вы показываете в своих примерах, вы хотите создать экземпляры своих моделей с помощью оператора new и передать IConfiguration в качестве параметра.Требуя IConfiguration в вашем контейнере данных, вы создаете ситуацию, когда вашей модели потребуется тщательная проверка, существует ли возвращаемый результат и существует ли каждое свойство в нем, и затем установка соответствующих значений в контейнере данных.

Лучшее решениеЭта проблема заключается в регистрации выделенного класса конфигурации, который мы будем называть BrahBrahConfig в соответствии с вашим примером, в инфраструктуре внедрения зависимостей.

public static IServiceCollection SetupDependencyInjection(this 
    IServiceCollection services, IConfiguration config)
{
    services.Configure<BrahBrahConfig>(config.GetSection("brahbrah"));

    return services;
}

В приведенном выше примере вы видите использование перегрузки для IServiceCollection Configure<TOptions>(this IServiceCollection services, IConfiguration config) который можно найти в пакете nuget "Microsoft.Extensions.Options.ConfigurationExtensions".

Эта перегрузка позволяет напрямую внедрить экземпляр IOptions в конструктор по вашему выбору.

private BrahBrahConfig _config;

public Parent(IOptions<BrahBrahConfig> config)
{
    _config = config?.Value ?? throw new ArgumentNullException(nameof(config));
}

Таким образом, после регистрации этого в файле startup.cs вы можете использовать IOptions в качестве параметра в конструкторе Parent и использовать эти параметры для установки соответствующих свойств в вашей модели.

...