我正在尝试将Dagger添加到现有的Web应用程序中,并且遇到了设计问题。
目前我们的处理程序是在调度程序中创建的,类似于
registerHandler('/login', new LoginHandler(), HttpMethod.POST)
在登录处理程序中,我们可以调用类似
的函数Services.loginService.login('username', 'password');
我希望能够将loginService注入到处理程序中,但是无法找出最佳方法。调度程序中有一个很长的处理程序列表,并将它们全部作为实例变量注入似乎是一大堆代码。
是否有解决此类问题的方法?
答案 0 :(得分:0)
根据您对注入不同服务的评论。我建议下一个解决方案。
<强> ServicesProvider 强>:
@Module(injects = {LoginHandler.class, LogoutHandler.class})
public class ServicesProvider {
@Provides @Singleton public LoginService getLoginService() {
return new LoginService();
}
}
<强> LoginHandler.java 强>:
public class LoginHandler extends Handler {
@Inject LoginService loginService;
}
<强> HttpNetwork.java 强>
public class HttpNetwork extends Network {
private ObjectGraph objectGraph = ObjectGraph.create(new ServicesProvider());
public registerHandler(String path, Handler handler, String methodType) {
getObjectGraph().inject(handler);
}
}
此解决方案中有一周的时间点 - 您无法轻松更改ServiceProvider
以用于测试目的(或任何其他类型的目的)。但是如果你也注入它(例如使用另一个对象图或只是通过构造函数),你可以解决这种情况。