Во-первых, чтобы ответить на ваш вопрос «могу ли я использовать файл конфигурации», ответ категорически «да». Почему бы вам не ответить позже, но сейчас, вот бедная версия того, как вы могли бы сделать это, добавив в свой файл appsettings.json
. Обратите внимание, что этот код не является оптимальным, но предназначен для того, чтобы показать вам, как вы могли бы реализовать это решение.
Давайте начнем с некоторых классов для хранения данных:
public class ServicesConfiguration
{
public IEnumerable<ServiceItem> Singleton { get; set; }
public IEnumerable<ServiceItem> Transient { get; set; }
}
public class ServiceItem
{
public string Service { get; set; }
public string Implementation { get; set; }
}
Теперь добавьте раздел в свой JSON-файл, вы можете даже захотеть оставить этот файл внешним по отношению к основной конфигурации, но я подробно остановлюсь на деталях реализации:
{
//snip main config....
"Services" : {
"Singleton": [
{
"Service": "YourNamespace.IFoo1, YourNamespace",
"Implementation": "YourNamespace.Foo1, YourNamespace"
},
{
"Service": "YourNamespace.IFoo2, YourNamespace",
"Implementation": "YourNamespace.Foo2, YourNamespace"
}
],
"Transient": [
{
"Service": "YourNamespace.IBar1, YourNamespace",
"Implementation": "YourNamespace.Bar1, YourNamespace"
}
]
}
}
А теперь метод расширения для настройки всего этого:
public static IServiceCollection AddFromConfigurationFile(this IServiceCollection services,
IConfigurationSection configuration)
{
var servicesConfiguration = configuration.Get<ServicesConfiguration>();
foreach(var service in servicesConfiguration.Singleton)
{
services.AddSingleton(Type.GetType(service.Service), Type.GetType(service.Implementation));
}
foreach(var service in servicesConfiguration.Transient)
{
services.AddTransient(Type.GetType(service.Service), Type.GetType(service.Implementation));
}
//Other scopes here...
return services;
}
И назовите это ConifigureServices
так:
services.AddFromConfigurationFile(Configuration.GetSection("Services"));
Итак, хорошо и просто, верно? Почему бы тебе не сделать это? Несколько идей из головы:
- Зачем менять работу почти всех реализаций DI? Если это не сломано, зачем это чинить? То, что вы привыкли к определенному методу, не означает, что это хорошая идея.
- Безопасность типов: вы теряете проверку времени компиляции типов, указанных вами в файле конфигурации.
- Безопасность: наличие этого в конфигурационном файле позволило бы кому-то изменить реализацию на класс по своему выбору.
Я уверен, что есть и другие, но ... это ваше приложение!