gpt4 book ai didi

dagger - 打破 Dagger 中的循环依赖

转载 作者:行者123 更新时间:2023-12-01 05:02:40 26 4
gpt4 key购买 nike

我对 Dagger 很陌生——我什至不知道它是否适用于我的应用程序

我有一个搜索页面,它返回有关给定名人的最新消息。

我写了一个测试来验证当我们搜索一个受欢迎的名人时结果会出现在页面上。
page有一个 searchField , 这需要 page在其构造函数中,以便我用于测试的 Web 驱动程序可以选择它。

名人搜索页面测试

public class CelebritySearchPageTest {
@Test
public void testSearchResultsForKevinBaconVerifyHisPopularity() {
CelebritySearchPage searchPage = new CelebritySearchPage();
searchPage.searchFor("Kevin Bacon");
Assert.assertTrue(searchPage.getNumberOfResults() > 9999999, "Verify that Kevin Bacon is still relevant");
}
}

名人搜索页
public class CelebritySearchPage extends Page {
@Inject
@Named("search field")
TextField searchField;

public void searchFor(String text) {
searchField.setText(text);
// ...
}

public int getNumberOfResults() {
// ...
}
}

名人搜索页面模块
@Module(injects = CelebritySearchPage.class)
public class CelebritySearchPageModule {
@Provides
@Named("search field")
public TextField provideSearchField() {
return new TextField(/* How do I get the page? */, "#searchField");
}
}


public abstract class Page {
// ...
}

文本字段
public class TextField {
protected Page page;
protected String selector;

public TextField(Page page, String selector) {
this.page = page;
this.selector = selector;
}

public void setText(String text) {
// ...
}
}

问题是 page需要 searchField , 但是 searchField需要 page .如何克服这种循环依赖?

我无法初始化 searchField CelebritySearchPage 内部

最佳答案

考虑一下:

名人搜索页面

public class CelebritySearchPage extends Page {
private final Lazy<TextField> searchField;
// always prefer constructor injection
// avoid @Named if possible, since the compiler cannot check the string
@Inject
CelebritySearchPage(@Named("search field") Lazy<TextField> searchField) {
this.searchField = searchField;
}
}

文本域
public class TextField {
protected final Lazy<Page> page;
protected final String selector;

@Inject TextField(Lazy<Page> page, String selector) {
this.page = page;
this.selector = selector;
}

/*
Lazy::get()
Return the underlying value, computing the value if necessary. All calls to the same Lazy instance will return the same result.
*/
}

我想一个 Lazy 也应该足够了。

关于dagger - 打破 Dagger 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com