1

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

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

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

在登录处理程序中,我们可能会调用类似的函数

Services.loginService.login('username', 'password'); 

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

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

4

1 回答 1

0

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

服务提供者

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

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

于 2013-11-10T08:59:31.607 回答