使用RoboGuice避免使用类范围的工厂

时间:2012-11-25 17:51:15

标签: java android roboguice

我正在尝试在Android项目中使用Model-View-Presenter模式。我正在使用优秀的RoboGuice项目AssistedInject来管理我的依赖项。我正在努力创建主持人实例的风格。

AssistedInject似乎要求我首先注入工厂来创建演示者,然后使用该工厂创建演示者的实例。注入(出现)仅适用于类范围级别;我不能注入局部变量。我的方法不需要工厂和演示者;我只关心工厂足够长的时间来生成一个演示者。我想避免让那些无用的工厂在周围。

更多详情

在我的模式实现中,我选择每个演示者和视图来保持对另一个的引用。演示者通常必须传递一个或多个用于与模型交互的“服务”对象。 Android Activity是(MVP)View的实现。活动必须是任何Android应用程序的组合根。因此,每个活动必须实例化一个演示者,该演示者需要一个服务以及对该视图的引用。

一般来说,演示者看起来像

public class GreatStuffPresenter {
    private final SomeService service;
    private final GreatStuffView view;

    @Inject
    public GreatStuffPresenter(SomeService service, @Assisted GreatStuffView view) {
        this.service = service;
        this.view = view;
        bind();
    }

    public void bind() {
        Record r = service.getSomeRecord();
        view.setField(r.field);
    }
}

和Activites看起来像

public class GreatStuffActivity extends RoboActivity {
    @Inject private final GreatStuffPresenterFactory presenterFactory;
    private GreatStuffPresenter presenter;

    @Override
    public void onCreate(...) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_update_record);

        presenter = presenterFactory.create(this);
    }
}

现在怎么办?

我不满意我必须在实例级别范围presenterFactory;我只在onCreate()期间需要它。我错过了RoboGuice可以为我演奏的一些额外魔力吗?如果没有,是否有更好的做法或模式我应该使用以避免这种不必要的范围界定?

1 个答案:

答案 0 :(得分:0)

最后,我决定使用RoboGuice注射器,询问我工厂的实例,并创建我正在寻找的主持人。我对这种方法感到相当满意;我没有用我不会使用的变量来污染我的班级,而且这条线看起来相当简单。

public class GreatStuffActivity extends RoboActivity {
    private GreatStuffPresenter presenter;

    @Override
    public void onCreate(...) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_update_record);

        presenter = RoboGuice.getInjector(this).getInstance(GreatStuffPresenterFactory.class).create(this);
    }
}