0

我正在尝试在我的 Android 项目中使用 Model-View-Presenter 模式。我正在使用带有AssistedInject的优秀 RoboGuice 项目来管理我的依赖项。我正在为创建演示者实例的风格而苦苦挣扎。

AssistedInject 似乎要求我首先注入一个工厂以创建演示者,然后使用该工厂创建演示者的实例。注入(似乎)仅在类范围级别起作用;我无法注入局部变量。我的方法不需要工厂和演示者;我只关心工厂足够长的时间来生成一个演示者。我想避免保留大部分无用的工厂。

更多详情

在我的模式实现中,我为每个演示者和视图选择保持对另一个的引用。通常必须向演示者传递一个或多个用于与模型交互的“服务”对象。Android Activity 是(MVP)视图的实现。Activity 必须是任何 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);
    }
}

和活动看起来像

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 可以为我表演的一些额外魔法?如果没有,我应该使用更好的做法或模式来避免这种不必要的范围界定吗?

4

1 回答 1

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);
    }
}
于 2012-12-06T17:18:08.363 回答