Tôi chỉ mới bắt đầu sử dụng dagger 2 và chưa sử dụng bất kỳ khung tiêm phụ thuộc nào khác trước đây. Bây giờ tôi bị mắc kẹt với sự phụ thuộc theo chu kỳ và tôi không biết cách giải quyết nó đúng cách. Hãy xem xét ví dụ sau đây trong một ứng dụng máy chủ, trong đó sử dụng các Reactor pattern với Java NIO:Phá vỡ sự phụ thuộc chu kỳ để sử dụng tiêm phụ thuộc
Tôi có một đối tượng Handler
gắn liền với một phím chọn được thực hiện khi thông tin mới đến trên mạng:
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
}
}
Các Client
lớp chứa một số trạng thái về ứng dụng được kết nối. Tất cả các Khách hàng được kết nối được quản lý trong lớp học Server
.
class Client {
Handler h;
public send(String response) {
h.send(response);
}
}
Khi đầu vào mới đến, Trình xử lý tạo các đối tượng Command
, thực thi chúng trên máy chủ và máy chủ cuối cùng sẽ trả lời ứng dụng.
Vì vậy, những gì tôi đang làm ngay bây giờ, đang tạo ra một đối tượng Client
bằng tay trong Handler
, đi qua trong một tài liệu tham khảo this
, để có thể gửi câu trả lời:
client = new Client(this);
Vì vậy, câu hỏi của tôi bây giờ là : Có vấn đề gì với thiết kế không? Có thể tách riêng Client
và Handler
không? Hoặc tôi chỉ nên sống với điều này và không sử dụng tiêm phụ thuộc everywhere
?
Tôi đánh giá cao đề xuất của bạn
Nếu tôi nhận được chính xác, tôi vẫn sẽ cần phải xây dựng đối tượng Client trong đối tượng Handler của tôi và chuyển một tham chiếu tới chính tôi ('new Client (new HandlerWrapper (this))'). Tôi mới vào điều tiêm phụ thuộc, nhưng nếu tôi hiểu nó đúng, bạn không bao giờ nên sử dụng toán tử 'new'. – S1lentSt0rm
+1 để áp dụng [Interface_segregation_principle] (http://en.wikipedia.org/wiki/Interface_segregation_principle) cũng được gọi là [Inversion_of_control] (http://en.wikipedia.org/wiki/Inversion_of_control). – k3b
@ S1lentSt0rm: Để làm cho 'Client' và' Handler' không phụ thuộc vào DI-Library, tất cả các dịch vụ và trình xử lý phải được thực hiện trong một modul dây riêng biệt bên ngoài businesslogic – k3b