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