微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打破Dagger中的循环依赖

我对匕首很新 – 我甚至不知道它是否适用于我的应用程序

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

我写了一个测试来验证当我们搜索一个受欢迎的名人时,结果会出现在页面上.

页面一个searchField,它在构造函数中需要页面,因此我用于测试的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) {
        // ...
    }
}

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

我无法在CelebritySearchPage内初始化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.
*/
}

我想一个懒人也应该足够了.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐