2016-12-23 2 views
-1

Я хочу следить за шаблонами проектирования эффективных методов при разработке приложений WinForms.Хорошая практика для отображения формы из UserControl

У меня есть UserControl с кнопкой «Добавить», чтобы открыть новую форму, в которой пользователь может искать Работников. Как я могу организовать свой код?

+0

Вы используете архитектуру MVVM с WinForms? У вас есть четко определенные объекты домена/бизнес-объекта? Нам нужна дополнительная информация о масштабах и дизайне вашего приложения. – Dai

+1

Я отмечаю, что если вы хотите следовать абсолютным лучшим практикам, вы, возможно, не используете WinForms. Что такое бизнес-обоснование использования WinForms вместо WPF? – Dai

+0

В настоящее время проект прост, класс Employee является частью классов моделей, созданных EF, и я хочу следовать шаблону MVP. – apaz

ответ

0

Если вы используете WinForms, вы должны использовать шаблон проектирования MVP (Model-View-Presenter). В этом случае каждый вид имеет свой собственный ISomethingView, который содержит свойство и событие, например:

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

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

И теперь ваш UserControl должен реализован этот интерфейс.

Кроме того, для каждого просмотра у Вас должен создать ведущий, который отвечает за связь между видом и бизнес-логики:

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

Вы можете использовать DI контейнер, чтобы решить все I*Vies, например:

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