2016-12-23 3 views
-1

Je souhaite suivre les modèles de conception de bonnes pratiques lors du développement d'applications WinForms.Bonne pratique pour afficher le formulaire à partir de UserControl

J'ai un UserControl avec un bouton "Ajouter" pour ouvrir un nouveau formulaire où l'utilisateur peut rechercher des employés. Comment je peux organiser mon code?

+0

Utilisez-vous l'architecture MVVM avec WinForms? Avez-vous des objets domaine/entreprise clairement définis? Nous avons besoin de plus d'informations sur la portée et la conception de votre application. – Dai

+1

Je remarque que si vous voulez suivre les meilleures pratiques, vous n'utilisez peut-être pas WinForms. Quelle est la justification commerciale de l'utilisation de WinForms au lieu de WPF, par exemple? – Dai

+0

Actuellement le projet est simple, la classe Employé fait partie des classes modèles créées par EF et je veux suivre le modèle MVP – apaz

Répondre

0

Si vous utilisez WinForms, vous devez utiliser le modèle de conception MVP (Model-View-Presenter). Dans ce cas, chaque vue a sa propre ISomethingView qui contient les propriétés et les événements, par exemple:

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

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

Et maintenant votre UserControl doit mis en œuvre cette interface.

pour chaque vue Aussi, vous devez créer un présentateur qui est responsable de la communication entre la vue et une logique commerciale:

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(); 
      } 
     } 
    } 

Vous pouvez utiliser conteneur DI pour résoudre tous les I*Vies, par exemple:

public class LoginUserControl : UserControl, ILoginView 
    { 
     public LoginUserControl() 
     { 
      this.loginPresenter = new LoginPresenter(this, DIContainer.Resolve<IOtherView>()); 
     } 
    }