0

AndroidプロジェクトでModel-View-Presenterパターンを使用しようとしています。依存関係を管理するために、AssistedInjectで優れたRoboGuiceプロジェクトを使用しています。プレゼンターのインスタンスを作成するスタイルに苦労しています。

AssistedInjectでは、最初にファクトリを注入してプレゼンターを作成し、次にそのファクトリを使用してプレゼンターのインスタンスを作成する必要があるようです。インジェクション(表示)は、クラススコープレベルでのみ機能します。ローカル変数を挿入できません。私の方法では、ファクトリとプレゼンターの両方は必要ありません。私は、単一のプレゼンターを生成するのに十分な長さのファクトリのみを気にします。ほとんど役に立たない工場を維持することは避けたいと思います。

より詳しく

パターンの実装では、プレゼンターとビューごとに、他のプレゼンターへの参照を保持するように選択します。プレゼンターには通常、モデルとの対話に使用される1つ以上の「サービス」オブジェクトを渡す必要があります。Androidアクティビティは、(MVP)ビューの実装です。アクティビティは、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 に答える