Модуль Guice с настраиваемым классом бетона - PullRequest
1 голос
/ 16 февраля 2012

Если у меня есть клиент, определенный следующим образом: -

public interface Client {
    void send(String message);
}

И реализация выглядит следующим образом: -

final class SocketClient {

    private Integer port;

    @Inject
    SocketClient(Integer port) {
        this.port = port;
    }

    @Override
    public void send(String message) {
        System.out.println("Sending message:- "+message+" to port "+port);
    }
}

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

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Первое решение, которое приходит на ум, - это создать SocketClientFactory интерфейс, который выглядит как

interface SocketClientFactory {
  SocketClient createForPort(int port);
}

, а затем получить заводские экземпляры, используя расширение с помощью инъекции .

1 голос
/ 16 февраля 2012

Вы должны будете реализовать что-то вроде одноэлементного PortAllocator, который бы отслеживал уже выделенные порты.Затем вы можете вставить это в свой клиент:

@Inject
SocketClient(PortAllocator portAllocator) {
  this.port = portAllocator.allocatePort();
}

PortAllocator может выглядеть примерно так:

@Singleton
class PortAllocator {
  private int nextPort = 1234;

  int allocatorPort() {
    return nextPort++;
  }
}

Вы можете отсоединиться, используя интерфейс, если хотите.Возможно, вам захочется подумать и о безопасности потоков.

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

...