注入TypeListener

时间:2015-06-08 12:27:15

标签: java guice

我有这种情况,我希望注入一个ObserveList<ArticlesDB> sortForSevenDays =FXCollections.observableArrayList(); for(ArticleDB article: articleDBList) { if() { //missing statement for comparing articles by date for past 7 days sortForSevenDays.add(article); } } 依赖项,但它永远不会工作,因为TypeListener用于实际执行注入。

我怎样才能完成这件事?是否有 guicey -way?

注意:

  • 我正在使用Guice 4.0
  • TypeListener将在MyManager之后使用。
  • Guice::createInjector返回之前,MyManager::registerTypeMyManager::use都会被调用。
  • Guice::createInjector表示MyDependency无法与MyManager实例化。我将在new返回后使用。

我创建了以下SSCCE来展示我的问题:

Guice::createInjector

1 个答案:

答案 0 :(得分:2)

我认为至少有些时候(在测试或代码分析中)类型的侦听器对他们正在侦听的类型没有凝聚力,因此没有理由拥有一个注入器。您将使用一个注入器来创建侦听器,使用一个注入器来创建要测试/分析的代码。

如果你真的想要一个注射器(例如,如果你想要听的注射器中的类型以及听者所需的类型是有凝聚力的)那么你最好的选择是AbstractModule的getProvider()方法。因此,如果MyTypeListener需要一个Foo实例,这就是MyModule的样子:

public class RecyclerViewFragment extends Fragment {

    RecyclerView mRecyclerView;
    RecyclerView.LayoutManager mLayoutManager;
    RecyclerView.Adapter mAdapter;

    public static RecyclerViewFragment newInstance() {
        return new RecyclerViewFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_recyclerview_advance, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new RecyclerViewMaterialAdapter(new CardAdapter());
        mRecyclerView.setAdapter(mAdapter);

        MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);
    }

如果您尚未使用 static class MyModule extends AbstractModule { @Override protected void configure() { TypeListener listener = new MyTypeListener(getProvider(Foo.class)); bindListener(Matchers.any(), listener); } } ,请事先警告您在构建注射器之前不能在提供者上调用getProvider()。只要你不从监听器的构造函数的上下文中调用它就可以了。

相关问题