Дизайн класса Service Manager, который использует внешние службы с использованием GUICE

#java #design-patterns #guice

#java #шаблоны проектирования #guice

Вопрос:

В моем приложении у меня есть Service Manager, который обрабатывает все мои запросы. Теперь этот диспетчер служб использует внешние службы для выполнения некоторых запросов определенного типа.

Например, рассмотрим приведенный ниже пример кода:

  Class ServiceManager{

    private final A a;
    private final B b;

    private ExternalService externalService; 


      @Inject
      public ServiceManager(A a, B b)
      {
                this.a =a;
                this.b =b;
      }

      public void processIncomingRequestUsingExternalService(){...}


      }
  

Теперь для того, чтобы инициализировать ExternalService, какой подход лучше использовать с помощью GUICE

  • Используйте внедрение setter, так как в будущем может появиться «n» количество внешних служб разного типа, которые может захотеть использовать этот менеджер служб.
  • Или используйте внедрение конструктора, как я использовал для объектов классов A и B, которые являются внутренним классом моего приложения.

Примечание: — Здесь ExternalService является вспомогательным средством для внешней службы.

Комментарии:

1. Внедрение конструктора > все (например olivergierke.de/2013/11/why-field-injection-is-evil ). Также всемогущие классы manger плохи. Принцип единой ответственности по-прежнему применяется, поэтому большой n = обычно плохой дизайн.

2. @zapl Моя точка зрения с большим n была, скажем, 2-3 внешними службами, которые, возможно, придется использовать моему менеджеру. Будет ли хорошо добавить все эти внешние сервисные помощники в конструктор.

Ответ №1:

Внедрение конструктора имеет следующие преимущества перед внедрением установщика:

  • Явно объявляйте зависимости тому, кто читает код.
  • Модульное тестирование становится более чистым.
  • Зависимости могут быть помечены как ‘окончательные’, тем самым увеличивая неизменяемость.

Хорошая документация, в которой более подробно обсуждаются различия: https://www.petrikainulainen.net/software-development/design/why-i-changed-my-mind-about-field-injection/