将Dagger添加到现有项目中

时间:2013-10-16 17:00:00

标签: dependency-injection dagger

我正在尝试将Dagger添加到现有的Web应用程序中,并且遇到了设计问题。

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

registerHandler('/login', new LoginHandler(), HttpMethod.POST)

在登录处理程序中,我们可以调用类似

的函数
Services.loginService.login('username', 'password'); 

我希望能够将loginService注入到处理程序中,但是无法找出最佳方法。调度程序中有一个很长的处理程序列表,并将它们全部作为实例变量注入似乎是一大堆代码。

是否有解决此类问题的方法?

1 个答案:

答案 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以用于测试目的(或任何其他类型的目的)。但是如果你也注入它(例如使用另一个对象图或只是通过构造函数),你可以解决这种情况。