Как удалить дублирование в контейнерах IoC для двух почти идентичных приложений?

У меня есть два приложения (в одном решении), которые зависят от одной и той же общей библиотеки (отдельный проект). Эта разделяемая библиотека выполняет большую часть работы и использует некоторые сервисы в качестве интерфейсных зависимостей.

Мой контейнер IoC для каждого приложения выглядит одинаково, за исключением одной службы, которая должна различаться между двумя приложениями. Как я могу свести к минимуму это дублирование в контейнерах IoC?


person redcurry    schedule 01.05.2020    source источник
comment
Вы можете переместить часть кода DI в отдельный проект, например MySharedLibrary.DI   -  person Guru Stron    schedule 01.05.2020
comment
@GuruStron Не могли бы вы немного подробнее объяснить, что вы имеете в виду?   -  person redcurry    schedule 02.05.2020
comment
пожалуйста, посмотрите мой ответ, @redcurry   -  person Guru Stron    schedule 02.05.2020


Ответы (1)


Если бы я правильно понял проблему (и принял во внимание, что трудно спорить о правильном решении, не видя фактического кода), подход был бы таким.

Предположим, у вас есть следующая структура решения:

SharedLib(can be just dll/nuget)
   ...
AppOne(refs and DI's shared)
   ...
AppTwo(refs and DI's shared)
   ...

Тогда что вам нужно сделать:

SharedLib
   ...
Shared.DI (refs SharedLib and package with your IoC container, and other stuff if needed)
   ...
AppOne (refs Shared.DI)
   ...
AppTwo (refs Shared.DI)
   ...

В Shared.DI вы создаете метод с именем вроде RegisterShared, который будет обрабатывать все регистрации и будет вызываться из AppOne и AppTwo. Я бы предложил что-то вроде этого:

public static RegistrationExtensions
{
    public static void RegisterShared(this YourIoCBuilder builder,
       Action<YourIoCBuilder> registerUniqueServiceAction)
    {
         // do the common stuff 
         registerUniqueServiceAction(builder);             
    }
}

Вы можете опустить registerUniqueServiceAction и зарегистрировать нужный сервис непосредственно перед или после, но лично я предпочитаю более явный API, поэтому было бы очевидно, что этот метод не регистрирует все необходимое для работы SharedLib. Также в зависимости от того, какой именно IoC вы используете, вы можете предоставить более очевидную подпись для registerUniqueServiceAction, чтобы было ясно, что на самом деле нужно.

person Guru Stron    schedule 02.05.2020