Я работаю с Ninject для реализации приложения с использованием внедрения зависимостей. Я чувствую, что у меня есть довольно полное понимание концепций, и мне очень понравилась слабосвязанная и тестируемая архитектура, которую приложение получило с помощью DI. Однако я борюсь с одним конкретным типом службы и ищу информацию о том, делаю ли я что-то неправильно или другие сталкивались с тем же.
По сути, я получаю некоторые сервисы/классы (довольно небольшое число), от которых не зависят другие сервисы. Из-за этого класс никогда не создается, даже если это требуется, поскольку он выполняет полезную роль в приложении. В качестве примера предположим, что у меня есть служба IMonkeyRepository и служба IMonkeyPopulator. Предположим, что служба IMonkeyPopulator действительно не имеет общедоступного API, и ее единственная обязанность (в соответствии с принципом единой ответственности) заключается в обнаружении обезьян в сети и заполнении ими IMonkeyRepository. Эта служба зависит от IMonkeyRepository и, возможно, некоторых других служб для обработки взаимодействия с сетью (например, данные конфигурации для портов и адресов). Однако у IMonkeyPopulator нет общедоступного API, это просто пустой интерфейс.
Это плохой дизайн или какой-то запах кода, который мне не хватает? Очевидно, я мог бы переместить эту функциональность в сам репозиторий, но мне это кажется нарушением SRP (репозиторий имеет полезные функции доступа и т. д. и фактически может быть заполнен несколькими службами). Некоторые подходы, которые я рассматривал или пробовал, но которые меня не устраивают:
- Сделайте так, чтобы у службы был один общедоступный метод, например Start, который необходимо вызвать, чтобы она начала работать. У этого есть недостаток, заключающийся в необходимости определения несколько произвольного места в системе для выполнения этого вызова.
- Привяжите службу к константе, которую я создаю при создании ядра Ninject. Это требует, чтобы я понимал, что никто не зависит от этой службы, поэтому ее нужно обрабатывать специально, что кажется неправильным.
- Добавьте несколько членов в службу и создайте графический интерфейс где-нибудь в моем приложении, который считывает эти значения (например, статус службы и т. д.). Очевидно, что добавление графического интерфейса в мое приложение, которое существует только по этой причине, довольно глупо (хотя иногда это полезно для отладки и т. д.).
Любые мысли или рекомендации?