Хорошая практика для отображения формы из UserControl

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

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


person apaz    schedule 23.12.2016    source источник
comment
Используете ли вы архитектуру MVVM с WinForms? Есть ли у вас четко определенные объекты домена/бизнес-сущности? Нам нужна дополнительная информация о масштабах и дизайне вашего приложения.   -  person Dai    schedule 23.12.2016
comment
Я отмечаю, что если вы хотите следовать абсолютно лучшим практикам, возможно, вы не используете WinForms. Каково, например, экономическое обоснование использования WinForms вместо WPF?   -  person Dai    schedule 23.12.2016
comment
В настоящее время проект прост, класс Employee является частью классов моделей, созданных EF, и я хочу следовать шаблону MVP.   -  person apaz    schedule 23.12.2016
comment
Я просто работаю с WinForms   -  person apaz    schedule 23.12.2016


Ответы (1)


Если вы используете 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>());
        }
    }
person Mateusz Radny    schedule 23.12.2016