Вопрос, очень специфичный для Net Core.Я хотел бы написать метод расширения для IServiceCollection
, который будет выполнять настройку в приложении.
Причина тому, что в настоящее время некоторые компоненты, такие как атрибут и контроллер, расположены в отдельных библиотеках.Итак, я хотел бы написать метод расширения, который позаботится о конфигурации для каждой из этих библиотек. Конфигурация должна быть независимой от конфигурации основного приложения.
Вот текущий код (который мне не нравится по вышеуказанной причине):
public void ConfigureServices(IServiceCollection services)
{
//..
services.AddMvc(options => {
// is needed for the library "filters".
options.Filters.Add(typeof(ExternalValidationActionFilterAttribute));
})
// is needed for the library "controllers"
.AddApplicationPart(typeof(ExternalController).Assembly)
.AddControllersAsServices();
//..
services.AddSingleton<ExternalControllerConfiguration>(new ExternalControllerConfiguration());
services.AddSingleton<ExternalValidationAttributeConfiguration>(new ExternalValidationAttributeConfiguration());
}
Единственный метод из основного приложения - AddMvc()
.Остальная часть кода специфична для внешних библиотек .Я хотел бы избежать смешивания логики, специфичной для внешней библиотеки, с логикой основного приложения.В идеале рефакторинг кода должен выглядеть следующим образом:
public void ConfigureServices(IServiceCollection services)
{
//..
services.AddMvc();
services.ConfigureExternalAttributes();
services.ConfigureExternalControllers();
//..
}
и
public static class ServiceCollectionExtensions
{
public static void ConfigureExternalAttributes(this IServiceCollection services)
{
// TBD: check if Mvc services added
// if not - add new, with options
// if yes - add options to existing
// options.Filters.Add(typeof(ExternalValidationActionFilterAttribute));
services.AddSingleton<ExternalValidationAttributeConfiguration>(new ExternalValidationAttributeConfiguration());
}
public static void ConfigureExternalControllers(this IServiceCollection services)
{
// TBD: check if Mvc services added
// if not - add new, with options
// if yes - add options to existing
// 1. If 'part' not present already: .AddApplicationPart(typeof(ExternalController).Assembly)
// 2. If 'AddControllersAsServices' not present already: .AddControllersAsServices();
// Else: skip
services.AddSingleton<ExternalControllerConfiguration>(new ExternalControllerConfiguration());
}
}
Моя последняя идея состояла в том, чтобы перейти на git-hub, посмотреть исходный код и придуматькакое-то решение.НО.Существуют ли общие способы достижения этого результата?Возможно, Microsoft уже думала об этом, поэтому я пытаюсь заново внедрить колесо?
Любые советы или примеры кода приветствуются.