gpt4 book ai didi

java - 打破循环依赖以使用依赖注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:16 25 4
gpt4 key购买 nike

我刚开始使用 dagger 2并且之前没有使用过任何其他依赖注入(inject)框架。现在我陷入了循环依赖,我不知道如何正确解决它。考虑服务器应用程序中的以下示例,它使用 Reactor pattern使用 Java NIO:

我有一个 Handler 对象附加到选择键,当新信息到达网络时执行:

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
}
}

Client 类保存有关已连接客户端的一些状态。所有连接的客户端都在 Server 类中进行管理。

class Client {
Handler h;

public send(String response) {
h.send(response);
}
}

当新的输入到达时,Handler 创建 Command 对象,在服务器上执行它们,服务器最终会响应客户端。

所以我现在正在做的是在 Handler 中手动创建一个 Client 对象,按顺序传入一个 this 引用能够发送响应:

client = new Client(this);

所以我现在的问题是:设计有问题吗? ClientHandler 是否可以解耦?还是我应该忍受这一点,不要到处使用依赖注入(inject)?

感谢您的建议

最佳答案

如果您希望客户端能够通过处理程序发回消息,那么以下可以打破您的周期:

// lives in a common package both classes access
public interface ResponseClass {
public void sendSomeMessage(String message);
}

public class Handler { // handler can also implement ResponseClass directly but I prefer using an additional class for flexibility.
public void whenYouCreateClient() {
Client client = new Client(new HandlerWrapper(this));
}

public static class HandlerWrapper implements ResponseClass {
private final Handler handler;

public HandlerWrapper(Handler handler) { this.handler = handler; }

public void sendSomeMessage(String message) {
handler.send(message);
}
}

public void send(String string) {
// enqueu string and inform reactor about interest in sending
}
}

public class Client {
ResponseClass rc; // naming should be improved :)

public void sendMessage(String message) {
rc.sendSomeMessage(message);
}
}

现在运行时您的类仍然绑定(bind)在一起,但就您的设计而言,您的客户端仅附加到通用 ResponseClass。

你可以有这样的层次结构:

通用 <-- 客户端 <-- 处理程序

handler 知道 client 和 common而客户只知道共同点。 (假设你把接口(interface)放在common包里)

代替客户端 <--> 处理程序

我特意使用 sendSomeMessage 来强调这是您在包装器/接口(interface)上调用的不同方法,但当然您可以随意命名它们。

一句话:我没有使用 dagger2,所以我不能肯定地说我所做的可以使用那个产品来完成,但这就是我如何解耦这种循环依赖

关于java - 打破循环依赖以使用依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28191743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com