2016-12-23 13 views
-1

WinFormsアプリケーションを開発する際に、優れたプラクティスのデザインパターンに従いたいと考えています。UserControlからフォームを表示することをお勧めします。

「Add」ボタンを持つUserControlを使用して、ユーザーが従業員を検索できる新しいフォームを開きます。コードをどのように整理できますか?

+0

WinFormsでMVVMアーキテクチャを使用していますか?ドメイン/ビジネスエンティティオブジェクトが明確に定義されていますか?アプリケーションの範囲と設計に関する詳細情報が必要です。 – Dai

+1

絶対ベストプラクティスに従う場合は、WinFormsを使用していない可能性があります。たとえば、WPFではなくWinFormsを使用するビジネス上の正当性は何ですか? – Dai

+0

現在のところ、プロジェクトはシンプルですが、EmployeeクラスはEFによって作成されたモデルクラスの一部であり、MVPパターンに従いたいと考えています – apaz

答えて

0

WinFormsを使用する場合は、MVP(Model-View-Presenter)デザインパターンを使用する必要があります。

public interface IBaseView 
    { 
     void Show(); 
     void Close(); 
    } 

    public interface ILoginView : IBaseView 
    { 
     string Login { get; } 
     string Password {get; } 
     event EventHandler SignIn { get; } 
    } 

そして今、あなたのユーザーコントロールは、このインタフェースを実装する必要があります。この場合、各ビューは、例えばプロパティとイベントが含まれISomethingViewを所有しています。それぞれについて、また

は、ビューとビジネスロジック間の通信を担当してプレゼンターを作成する必要があります表示します。

public LoginPresenter 
    { 
     // private variables 

     public LoginPresenter(ILoginView loginView, IOtherView otherView) 
     { 
      this.loginView = loginView; 
      this.otherView = otherView; 

      this.loginView.SignUp += OnSignUp; 
     } 

     private void OnSignUp(object sender, EventArgs eventArgs) 
     { 
      if (this.authService.Login(this.loginView.UserName, this.loginView.Password)) 
      { 
       this.loginView.Close(); 
       this.otherView.Show(); 
      } 
     } 
    } 

次の例のように、すべてのI*Viesを解決するためにDIコンテナを使用することができます。

public class LoginUserControl : UserControl, ILoginView 
    { 
     public LoginUserControl() 
     { 
      this.loginPresenter = new LoginPresenter(this, DIContainer.Resolve<IOtherView>()); 
     } 
    } 
関連する問題