Dependency injection 向现有项目添加Dagger

Dependency injection 向现有项目添加Dagger,dependency-injection,dagger,Dependency Injection,Dagger,我试图将Dagger添加到现有的web应用程序中,但遇到了一个设计问题 目前,我们的处理程序是在调度程序中创建的 registerHandler('/login', new LoginHandler(), HttpMethod.POST) 在登录处理程序中,我们可以调用如下函数 Services.loginService.login('username', 'password'); 我希望能够将loginService注入到处理程序中,但我很难找到最佳方法。在dispatcher中有一个非

我试图将Dagger添加到现有的web应用程序中,但遇到了一个设计问题

目前,我们的处理程序是在调度程序中创建的

registerHandler('/login', new LoginHandler(), HttpMethod.POST)
在登录处理程序中,我们可以调用如下函数

Services.loginService.login('username', 'password'); 
我希望能够将loginService注入到处理程序中,但我很难找到最佳方法。在dispatcher中有一个非常长的处理程序列表,将它们全部作为实例变量注入看起来像是添加了大量代码


有解决此类问题的方法吗?

根据您关于要注入不同服务的评论。我将提出下一个解决方案

服务提供商

@Module(injects = {LoginHandler.class, LogoutHandler.class})
public class ServicesProvider {
    @Provides @Singleton public LoginService getLoginService() {
        return new LoginService();
    }
}
public class LoginHandler extends Handler {
   @Inject LoginService loginService;
}
LoginHandler.java

@Module(injects = {LoginHandler.class, LogoutHandler.class})
public class ServicesProvider {
    @Provides @Singleton public LoginService getLoginService() {
        return new LoginService();
    }
}
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
。但如果您也将其注入(例如,使用另一个对象图或仅通过构造函数),则可以修复这种情况。

您的处理程序是否从可以修改的基类扩展而来?是的。有没有办法在基类中配置它?不过,每个处理程序可能需要访问不同的服务。另一个弱点是我有大约200个处理程序。在我看来,必须列出我拥有的/添加到注入列表中的每个处理程序是没有效率的。在这种情况下,您可以让BaseHandler将所有服务注入BaseHandler中,并使用特定处理程序所需的服务。或者为特定服务包装另一个基类。不幸的是,我不确定dagger是否适合模板类