Android Dagger依赖周期

时间:2018-06-20 23:30:37

标签: android dependency-injection cycle dagger

我有两个相互依赖且具有相同Scope的依赖项。

我的依赖项是具有不同方法的域服务(每种方法都有不同的业务案例)。一些业务案例可能会使用其他领域的方法。

为此,我需要domain1可用于domain2,反之亦然。

但是当我这样做时,我得到了一个依赖循环编译错误。谷歌搜索一段时间后,我发现为了克服此问题,我必须使用@Inject注释而不是@Module中的构造函数参数注入一个依赖项。

当我尝试这样做时,代码可以编译,但匕首根本没有注入第二个依赖项。

有没有办法用Dagger实现我想要的?

1 个答案:

答案 0 :(得分:2)

您的问题:AClass对BClass具有构造函数依赖性,而BClass对AClass具有构造函数依赖性。即使没有Dagger,这也行不通:如果它们相互依赖,那么您将首先创建哪个?

您尝试的解决方案::如果您使用new创建一个类(BClass),并且该类不再具有带有@Inject注释的构造函数,则可以等到在构造AClass来填充您的BClass实例之后。但是,如果使用new创建对象,则需要通过将其传递到member-injection方法或MembersInjector<BClass>对象中来注入对象。您还需要确保这种情况发生在@Provides方法之外(因为调用@Provides的全部原因是,因此您可以构造一个值以传递到AClass的构造函数中)。这很脆弱而且很丑。

我的建议:使用indirection via Provider。让AClass注入Provider<BClass>或BClass注入Provider<AClass>,或两者都注入。只要您不在构造函数中调用get,就可以允许Dagger创建AClass并将BClass的创建推迟到需要时再进行。您无需进行其他配置即可为组件中绑定的任何类T注入Provider<T>Lazy<T>;有关可用注射的完整列表,请参见"Bindings in the Graph" in the User's Guide