.NET Core DI: настройка библиотек с использованием библиотек - PullRequest
1 голос
/ 15 апреля 2019

Я планирую преобразовать набор различных инструментов в различные пакеты 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: Когда библиотека добавляет другую библиотеку, должна ли она использовать основную коллекцию служб, т.е. использовать тот же экземпляр контейнера, что и остальная часть приложения, или она должна использовать свой собственный отдельный экземпляр контейнера

Полагаю, что если мы используем основной контейнер, то верно следующее:

  • Мы сохраняем инверсию контроля, предоставляя композиции корневой контроль даже над зависимостями библиотек.
  • Трудно заставить включенную библиотеку использовать (например) другую конечную точку ведения журнала, чем собственная логика нашего приложения. (Глупый пример, но могут быть и более подходящие.)
  • Может стать неясным, что мы настраиваем ведение журнала, что может повлиять на все приложение, даже если оно выглядит , как будто мы просто настраиваем одну библиотеку.
...