我有两个相互依赖且具有相同Scope的依赖项。
我的依赖项是具有不同方法的域服务(每种方法都有不同的业务案例)。一些业务案例可能会使用其他领域的方法。
为此,我需要domain1可用于domain2,反之亦然。
但是当我这样做时,我得到了一个依赖循环编译错误。谷歌搜索一段时间后,我发现为了克服此问题,我必须使用@Inject注释而不是@Module中的构造函数参数注入一个依赖项。
当我尝试这样做时,代码可以编译,但匕首根本没有注入第二个依赖项。
有没有办法用Dagger实现我想要的?
答案 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。