2010-12-02 10 views
2

私はWindowsフォームでMVPパターンを実装しています。これをより複雑なアーキテクチャに合わせようとしている現在の実装について質問があります。 今私はプロパティを持つ完全な無関心ビュー、コンストラクタでビューを注入するプレゼンタ、およびプレゼンタのインスタンスを持つビューを持っています。からプレゼンターにMVPフローの質問

  • コール方法:これは、私は2つのタスクを達成することができます。このようにプレゼンター

    public class MyPresenter 
    { 
        private IMyView view; 
        private MyModel model; 
        // 
        public MyPresenter(IMyView view) 
        { 
         // injection 
         this.view = view; 
        } 
    } 
    

    ある

    public class MyView : IMyView 
    { 
        public MyView() 
        { 
         var presenter = new MyPresenter(this); 
         presenter.Init(); 
        } 
    } 
    

    ビュー:これはコードですビュー

  • var view = ioc.Resolve<IMyView>(); 
    var presenter = ioc.Resolve<MyPresenter>(); //view injected 
    NavigationService.Show(presenter.View); 
    

    これまでのところは良い:私は簡単にこの1のようなコードを書くことができるように、私はIoCコンテナを使用していますすべてのものを編成するには

  • :プレゼンター からの眺めは今、私は2つの質問があります。

  • 最初の質問:ジョブが完了したら、プレゼンターからモデルをどのように取り戻すことができますか?ビューで使用されるプレゼンターは、IoCコンテナから使用しているプレゼンターと同じではありません。ビューは単独で新しいプレゼンターをインスタンス化します。プレゼンターによって公開されるモデルは、ビューでインスタンス化されたモデルと同じではありません。

  • 第2の質問:私はこのMVPトライアドに既存のモデルをどのように渡すことができますか?たとえば、このコードをのために動作させるにはどうすればいいですか?詳細ビューモデルはリポジトリからのものですか?よりクリーンなアプローチを持っている

答えて

0

を助けました。 ビューは現在、プレゼンターのインスタンスを作成しませんが、それは次のように発表者自身によって注入1を取得します。

public MyPresenter(IView myView, Model myModel) 
{ 
    this.View = myView; 
    this.View.Presenter = this; 
    this.Model = myModel; 
} 

これまでのところ、とても良いです。

public class MyView : IView 
{ 
    public MyPresenter Presenter { get; private set; } 
} 

これまでのところは良い:それはビューで変更することはできませんが、それだけで使用することができるように 今すぐ見る側に、プレゼンターは唯一のプロパティの書き込みとして公開されます。 今のIoCはこれを行います。私にとって

var view = IoC.Resolve<IView>(); 
var model = repository.GetModel(); // or new Model(); 
var presenter = IoC.Resolve<MyPresenter>(); //view and model injected 
presenter.ShowView(); 
var result = presenter.Model; 

を、それが良さそうに見えますが、私はちょうど私がMVPロジックを壊すわけではないことを確認したいです。

3

あなたは常にあなたがそれを作成し、発表の外モデルへの参照を持ってこれを行うことにより、あまりにも

public class MyPresenter 
{ 
    private IMyView view; 
    private MyModel model; 

    public MyPresenter(IMyView view, MyModel model) 
    { 
     this.view = view; 
     this.model = model 
    } 
} 

、プレゼンターにモデルを注入します。

このようにしているときは、いつでも使用するモデルを選択できます。 たとえば、バックエンド(あなたのモデル)が完成していない場合は、モデルのインタフェースを使用するときにモックモデルを作成して、プレゼンターとビューをテストすることができます。

希望これは私が依存関係を反転させ、すべてを変更することに基づいて

+0

私はこの種の解決策については考えていませんでした。 – Raffaeu