2011-08-02 12 views
3

アーキテクチャの経験はほとんどありませんMVPのアプローチを取る.NET 4プラットフォームのソリューションは、DRYKISSソリューションを設計しようとしています。デスクトップ(WinForms)およびWeb(ASP.NETまたはSilverlight)製品として実装できます。私はいくつかのMVC、MVVMの仕事をしましたが、何らかの理由で私はこの特定のものの周りを頭で囲むのが難しいので、私は最も簡単なサンプルから始めることを決めました。あなたに何か助けを求める。デスクトップ(WinForms)とWeb(ASP.NET)ソリューションでMVPパターンを適用する最も簡単なアプローチ

internal class Person 
{ 
    internal string FirstName { get; set; } 
    internal string LastName { get; set; } 
    internal DateTime Born { get; set; } 
} 

public class People 
{ 
    private readonly List<Person> _people = new List<Person>(); 
    public List<Person> People { get { return _people; } } 
} 

私が思っていた:

  1. を最も一般的な方法だろうどのような次のようにそう(実際には、ほとんど間違いなくWCF呼び出しだろう)、非常に単純なモデルを想定し

    ConsoleとForms UIのView/Presenterトライアッド(およびヘルパー)を実装するには?

  2. これらのうちどれをインタフェースとして宣言し、抽象クラスとして宣言する必要がありますか?
  3. コマンドは常にレイヤー間の通信に推奨されますか?

最終的に:ちょうどそれを達成するための十分に文書化され、testable、軽いフレームワークがありますか?

+0

ような何かをしたいビュー/コントローラをインスタンス化するためにあなたはhttp://stackoverflow.com/q/5381847/575659 – dantuch

+0

@dantuch MVPは、私がここに投稿したリンクを訪問してyourselveを理解すべきです:コメントをありがとう - 私はそれらをチェックし、それらが有用だが、私が実際に見ているのは概念的なものではなく実装志向のアプローチ(慣習、コードサンプル、フレームワーク)を考えることです。 –

答えて

5

GUIとwinforms UIが必要な多くのアプリケーションを作成しましたが、MVPを実装するのに一般的に取っていたアプローチは、汎用ビューインターフェイス(より具体的なビューの場合はサブクラス化できます)とコントローラベースビューが与えられたクラス。その後、相続人インターフェース

interface IView 
{ 
    event EventHandler Shown; 
    event EventHandler Closed; 

    void ShowView(IView parentView); 
    void CloseView(); 
} 

class ControllerBase<T> where T: IView 
{ 
    private T _view; 

    public ControllerBase(T view) 
    { 
     _view = view; 
    } 

    public T View 
    { 
     get { return _view; } 
    } 

    public void ShowView(IView owner) 
    { 
     _view.ShowView(owner); 
    } 

    public void ShowView() 
    { 
     ShowView(null); 
    } 

    public void CloseView() 
    { 
     _view.CloseView(); 
    } 
} 

それはこのビューを実装するには、特定の場合

interface IPersonView: IView 
{ 
    event EventHandler OnChangeName; 
    string Name { get; set; } 
} 

class PersonController: ControllerBase<IPersonView> 
{ 
    public PersonController(string name,IPersonView view) : base(view) 
    { 
     View.Name = name; 
     View.OnChangeName += HandlerFunction; 
    } 

    private void HandlerFunction(object sender, EventArgs e) 
    { 
     //logic to deal with changing name here 
    } 
} 

で作業する方法の例をIViewの(またはそれ以上の特定のビュー)から継承する別のビューの実装を作成することができますあなたのフォームがIPersonViewから継承し、必要なすべてのプロパティ/イベントを実装していることを確認してください。あなたは以下の

PersonForm form = new PersonForm(); 
PersonController controller = new PersonController("jim",form); 
controller.ShowView(); 
+0

Glennの貢献に感謝します。不可避のMVP/MVCの混乱を避けるために、それらの主な違いについて詳しく教えてください。 –

+1

MVCでは、コントローラ上でアクションを呼び出すビューがあり、コントローラはイベントを発生させるモデルをビューに変更します。 MVPは、モデルとビューが直接通信することはなく、すべてのビューイベントはモデルを更新するプレゼンタに送られ、プレゼンタもまたビューを更新する責任があります。 – Glenn

+1

私はなぜPresenterクラス 'ContollerBase'に名前をつけたのですか(' PresenterBase'ではないはずですか?)、それがモデルとどのように通信しているのですか? –

関連する問題