C# 如何使用MVP和被动视图形成.ShowDialog()?

C# 如何使用MVP和被动视图形成.ShowDialog()?,c#,winforms,mvp,passive-view,platform-agnostic,C#,Winforms,Mvp,Passive View,Platform Agnostic,摘要 我正在Windows窗体应用程序中试验MVP模式 我想让我的演示者和视图不受平台的影响,因此如果我想将我的应用程序移植到另一个平台,比如Web或移动平台,我只需要使用依赖于平台的GUI实现视图,我的演示者仍然可以独立于平台 现在我想知道,如何使用MVP和被动视图显示Dialog() 据我目前的理解,被动观点不应该了解/关心任何演讲者。他们甚至不知道它的存在。因此,根据我的说法,这个问题的答案中提出的解决方案并不合适: 一些代码示例有助于理解: 应用程序视图 public partial

摘要

我正在Windows窗体应用程序中试验MVP模式

我想让我的演示者和视图不受平台的影响,因此如果我想将我的应用程序移植到另一个平台,比如Web或移动平台,我只需要使用依赖于平台的GUI实现视图,我的演示者仍然可以独立于平台

现在我想知道,如何使用MVP和被动视图显示Dialog()

据我目前的理解,被动观点不应该了解/关心任何演讲者。他们甚至不知道它的存在。因此,根据我的说法,这个问题的答案中提出的解决方案并不合适:

一些代码示例有助于理解:

应用程序视图

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
ApplicationPresenter

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
IDialogView

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
IView

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
IAAuthenticationPresenter

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
公共接口IAAuthenticationPresenter:IPresenter{
void OnConnect();
void OnViewDatabaseInstanceChanged(选择ChangedEventArgs e);
void OnViewLoginChanged();
void OnViewPasswordChanged();
}
i当前用户

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
公共接口i当前者,其中V:IView{
V视图{get;}
OnViewInitialize();
OnViewLoad();
ShowView();
}

基于这些前提:

  • 演讲者应是平台无关者
  • 只有视图知道如何显示自己(WPF、Mobile、Silverlight、Web、WinForms…)
  • 视图必须提供一种显示自身的方式
  • 视图不必与平台无关,因为不同平台的显示会有所不同
  • 但演示者应在显示自己时对视图进行排序
我想到了这一点:

IView

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
i当前用户

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
ApplicationPresenter

public partial class ApplicationForm : Form, IApplicationView {
    // I ensure that all the IApplicationView events are raised 
    // upon button clicks text changed, etc.
    // The presenter, which this view ignores the existence, 
    // is subscribed to the events this view raises.
}
public class ApplicationPresenter 
    : Presenter<IApplicationView>
    , IApplicationPresenter {
    public ApplicationPresenter(IApplicationView view) : base(view) {
        View.OnViewShown += OnViewShown;
    }

    public void OnViewShown() {
        IAuthenticaitonView authView = new AuthenticationForm();
        IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
        authPresenter.ShowDialog(); // 1.                       
    }
}
public interface IAuthenticationView : IDialogView {
    string ErrorMessage { get; set; }
    string Instance { get; set; }
    IEnumerable<string> Instances { get; set; }
    string Login { get; set; }
    string Password {get; set; }

    void EnableConnectButton(bool enabled);

   event VoidEventHandler OnConnect;
   event SelectionChangedEventHandler OnDatabaseInstanceChanged;
   event VoidEventHandler OnLoginChanged;
   event VoidEventHandler OnPasswordChanged;
}
public interface IDialogView : IView {
    void ShowDialog();
}
public interface IView { 
    void Show();

    event VoidEventHandler OnViewInitialize;
    event VoidEventHandler OnViewLoad;
    event VoidEventHandler OnViewShown;
}
public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
    void OnConnect();
    void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
    void OnViewLoginChanged();
    void OnViewPasswordChanged();
}
public interface IPresenter<V> where V : IView {
    V View { get; }

    OnViewInitialize();
    OnViewLoad();
    ShowView();
}
  • 这将引发IAAuthenticationView已订阅的
    OnShowView
    事件。然后,回到表单中,视图对事件的响应是:
  • 身份验证表单

    public partial class ApplicationForm : Form, IApplicationView {
        // I ensure that all the IApplicationView events are raised 
        // upon button clicks text changed, etc.
        // The presenter, which this view ignores the existence, 
        // is subscribed to the events this view raises.
    }
    
    public class ApplicationPresenter 
        : Presenter<IApplicationView>
        , IApplicationPresenter {
        public ApplicationPresenter(IApplicationView view) : base(view) {
            View.OnViewShown += OnViewShown;
        }
    
        public void OnViewShown() {
            IAuthenticaitonView authView = new AuthenticationForm();
            IAuthenticationPresenter authPresenter = new AuthenticationPresenter(authView);
            authPresenter.ShowDialog(); // 1.                       
        }
    }
    
    public interface IAuthenticationView : IDialogView {
        string ErrorMessage { get; set; }
        string Instance { get; set; }
        IEnumerable<string> Instances { get; set; }
        string Login { get; set; }
        string Password {get; set; }
    
        void EnableConnectButton(bool enabled);
    
       event VoidEventHandler OnConnect;
       event SelectionChangedEventHandler OnDatabaseInstanceChanged;
       event VoidEventHandler OnLoginChanged;
       event VoidEventHandler OnPasswordChanged;
    }
    
    public interface IDialogView : IView {
        void ShowDialog();
    }
    
    public interface IView { 
        void Show();
    
        event VoidEventHandler OnViewInitialize;
        event VoidEventHandler OnViewLoad;
        event VoidEventHandler OnViewShown;
    }
    
    public interface IAuthenticationPresenter : IPresenter<IAuthenticationView> {
        void OnConnect();
        void OnViewDatabaseInstanceChanged(SelectionChangedEventArgs e);
        void OnViewLoginChanged();
        void OnViewPasswordChanged();
    }
    
    public interface IPresenter<V> where V : IView {
        V View { get; }
    
        OnViewInitialize();
        OnViewLoad();
        ShowView();
    }
    
    然后,视图显示为对话框/模式窗口