Właśnie zacząłem używać dagger 2 i wcześniej nie stosowałem żadnej innej struktury wtrysku zależności. Teraz utknąłem w cyklicznej zależności i nie wiem, jak rozwiązać to poprawnie. Rozważmy następujący przykład w aplikacji serwera, który wykorzystuje Reactor pattern z Java NIO:Przerwij cykliczną zależność, aby użyć wstrzyknięcia zależności.
Mam Handler
obiekt dołączony do klawisza wyboru, który jest wykonywany, gdy nowe informacje przybywa w sieci:
class Handler implements Runnable {
Server server;
Client client;
public void run {
// static factory method that eventually calls a method on server, passing in 'client' as argument
Command.parse(input).execute(server, client);
}
public void send(String string) {
// enqueu string and inform reactor about interest in sending
}
}
The Client
klasa przechowuje pewien stan o podłączonym kliencie. Wszyscy podłączeni klienci są zarządzani w klasie Server
.
class Client {
Handler h;
public send(String response) {
h.send(response);
}
}
Kiedy przybywa nowy wejściowego, Handler tworzy Command
obiektów, wykonuje je na serwerze, a serwer ostatecznie odpowie na kliencie.
Więc co robię teraz, jest stworzenie Client
obiekt ręcznie w Handler
, przechodzącą w this
odniesienia, aby móc wysłać odpowiedź:
client = new Client(this);
Więc moje pytanie jest teraz : Czy coś jest nie tak z projektem? Czy można odłączyć Client
i Handler
? Czy powinienem po prostu żyć z tym i nie używać iniekcji zależności everywhere
?
Doceniam wasze sugestie
Jeśli mam go poprawnie, nadal będę musiał skonstruować obiekt klienta w moim obiekcie Handler i przekazać w odniesieniu do mnie ('new Client (new HandlerWrapper (this))'). Jestem nowicjuszem w dziedzinie wtrysku zależności, ale jeśli dobrze to zrozumiałem, nigdy nie powinieneś używać operatora 'new'. – S1lentSt0rm
+1 za zastosowanie [Interface_segregation_principle] (http://en.wikipedia.org/wiki/Interface_segregation_principle) zwanego również [Inversion_of_control] (http://en.wikipedia.org/wiki/Inversion_of_control). – k3b
@ S1lentSt0rm: Aby "Klient" i "Handler" nie były zależne od biblioteki DI, cała konstrukcja usług i modułów obsługi powinna być wykonana w jednym oddzielnym module połączeń poza domeną businesslogic – k3b