Я планирую преобразовать набор различных инструментов в различные пакеты NuGet. Идея состоит в том, чтобы использовать стиль внедрения зависимостей в стиле services.AddMvc()
(я не уверен, как он называется). Давайте назовем это шаблоном ConfigureServices .
Короче говоря, идея состоит в том, чтобы включить использование библиотек следующим образом:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// ...
services.AddSomeLibrary(/* potential configuration here */);
// ...
}
public void Configure(IApplicationBuilder application)
{
// ...
application.UseSomeLibrary(); // If necessary
// ...
}
Вопрос 1: Есть ли предпочтительный способ получить что-то вроде строки подключения в метод расширения AddSomeLibrary()
?
Дополнительная проблема возникает, когда OuterLibrary зависит от InnerLibrary, что, в свою очередь, требует некоторой конфигурации - скажем, строки подключения.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// AddOuterLibrary's implementation will call AddInnerLibrary(...)
// Are we going to ask for InnerLibrary's configuration input here?
services.AddOuterLibrary(...);
}
Вопрос 2: Как AddOuterLibrary()
получить данные конфигурации, необходимые для вызова AddInnerLibrary()
?
В частности, я полагаю, что некоторые параметры конфигурации могут выглядеть очень неясными, если не знать, какая из них настраивается для библиотеки.
Возможно, в ответе можно использовать пример внешней библиотеки в зависимости от библиотеки журналов. Библиотеке журналирования потребуется конкретный тип регистратора для использования (тот, который регистрируется в ElasticSearch, тот, который регистрируется в MySql, ...) и строка подключения (которая имеет смысл только для ее конкретного конкретного типа регистратора).
И затем существует вероятность того, что InnerLibrary также используется непосредственно нашим приложением и, возможно, третьей библиотекой.
Вопрос 3: Когда библиотека добавляет другую библиотеку, должна ли она использовать основную коллекцию служб, т.е. использовать тот же экземпляр контейнера, что и остальная часть приложения, или она должна использовать свой собственный отдельный экземпляр контейнера
Полагаю, что если мы используем основной контейнер, то верно следующее:
- Мы сохраняем инверсию контроля, предоставляя композиции корневой контроль даже над зависимостями библиотек.
- Трудно заставить включенную библиотеку использовать (например) другую конечную точку ведения журнала, чем собственная логика нашего приложения. (Глупый пример, но могут быть и более подходящие.)
- Может стать неясным, что мы настраиваем ведение журнала, что может повлиять на все приложение, даже если оно выглядит , как будто мы просто настраиваем одну библиотеку.