Внедрение конструктора в класс, состоящий только из статических методов? - PullRequest
0 голосов
/ 08 октября 2019

Я работаю над API, который взаимодействует с частной аппаратной частью. В этом API я создал вспомогательный класс (для этого поста назовем его B), состоящий только из static методов. Большинство из этих методов зависят от другого класса для связи с оборудованием, назовем это A. В настоящее время я немного не уверен, как спроектировать зависимость B от A, так как я не могу создать экземпляр B и внедрить зависимость с помощью инжектора конструктора. С точки зрения дизайна, как лучше всего моделировать это поведение?

Для более подробного описания вот то, чего я пытаюсь достичь. Допустим, A имеет объявления некоторых других классов, например, так:

class A
{
   private HardwareCommunicator communicator;
   private ModelLoader modelLoader; 

   public HardwareCommunicator getCommunicator()
   {
      return communicator;
   }

   public ModelLoader getModelLoader()
   {
      return modelLoader;
   }

}

И B, а затем имеет static методы вроде этого, которые стремятся использовать некоторые члены, объявленные в A* 1016. *

class B
{
   public static PerformOperation()
   {
      AnotherClass c = new AnotherClass();
      c.someMethod(someValue, hardwareCommunicator.getCommunicator()); // Needs reference

   } 
}

Очевидно, что B нужна ссылка на A, поэтому в настоящее время я возился с передачей зависимости в качестве аргумента методу, например:

class B
{
   public static PerformOperation(HardwareCommunicator communicator) // Passed as argument
   {
      AnotherClass c = new AnotherClass();
      c.someMethod(someValue, communicator.doSomething()); // OK, so far so good
   }
}

Теперь ястолкнуться с проблемой, что мне иногда нужно на больше зависимостей, чем просто communicator в B, например, в другом методе static в B мне могут понадобиться как HardwareCommunicator, так и ModelLoader

class B
{
   public static SomeOtherOperation(HardwareCommunicator communicator)
   {
      AnotherClass c = new AnotherClass();
      c.SomeMethod(someValue, communicator.doSomething(), 
                              ModelLoader.getModelLoader()); // Missing reference
   }
}

ОК, поэтому я мог бы просто передать это как параметр, но теперь я думаю, что у меня архитектурная проблема. Я должен (не так ли?) Быть в состоянии просто пойти

class B
{
    public static SomeOtherOperation()
    {
       AnotherClass c = new AnotherClass();
       c.someMethod(someValue, instanceOfA.getCommunicator(),
                               instanceOfA.getModelLoader());
    }
}

Без возможности вызвать конструктор на B и передать экземпляр A Я, очевидно, не могу этого достичьповедение.

Чего мне не хватает? Спасибо.

...