c# - 在MVC模式中,如何实现类之间的通信?

标签 c# events design-patterns model-view-controller

序言:这个问题与 ASP.NET MVC 框架无关。

编辑:更清楚地说,该应用程序是用 C# 编写的游戏,因此各种 Web 框架不适用。


在使用 MVC 模式构建内容时,我应该如何最好地将类与事件连接起来?

我想编写一些 MVC 代码,以便我可以了解有关设计模式的更多信息。我理解为什么模式的这三个元素应该是分开的,但我不太确定如何实现将它们连接在一起。我是用 C# 写的,我也是新手,我突然意识到应该使用事件。我主要不确定应该如何正确订阅/取消订阅事件,并且我需要进行健全性检查。

例如,我将发布 View / Controller 类。在此示例中, View 想要发送 DataRequest 事件,而 Controller 想要订阅该事件,以便将其传递给模型。另一方面, Controller 会在某个时刻引发 View 应该订阅的 DataUpdated 事件。我实现他们相互订阅的方式有意义吗?

////////////////////////////////////////////////////
public class UIScreenView
{
    public event System.EventHandler<System.EventArgs> DataRequestedEvent;

    //====================================
    private void DataUpdatedEventHandler(object sender, System.EventArgs args);


    //====================================
    //====================================
    public void Subscribe(UIScreenController controller)
    {
        controller.DataUpdatedEvent += DataUpdatedEventHandler;
        controller.Subscribe(this);
    }

    //====================================
    //====================================
    public void UnSubscribe(UIScreenController controller)
    {
        controller.DataUpdatedEvent -= DataUpdatedEventHandler;
        controller.UnSubscribe(this);
    }
}

和 Controller :

public class UIScreenController
{
    private UIScreenView view;

    public event System.EventHandler<System.EventArgs> DataUpdatedEvent;

    private void DataRequestedEventHandler(object sender, System.EventArgs args);

    public void Init(UIScreenView v)
    {
        view = v;

        if (view != null)
        {
            view.Subscribe(this);
        }
    }

    ~UIScreenController()
    {
        if (view)
        {
            view.UnSubscribe(this);
            view = null;    
        }
    }

    public void Subscribe(UIScreenView view)
    {
        view.DataRequestedEvent += DataRequestedEventHandler;
    }

    public void UnSubscribe(UIScreenView view)
    {
        view.DataRequestedEvent -= DataRequestedEventHandler;
    }

    private void DataRequestedEventHandler(object sender, System.EventArgs args)
    {
        //request data from model
    }
}

最佳答案

你所做的和尝试做的是MVP模式,而不是MVC。简而言之,MVC 模式用于请求响应架构,而不是事件驱动。流程为:

  • UI 执行请求
  • Controller 接受请求
  • Controller 处理请求(如访问模型等)
  • Controller 将响应发送到 UI

如果你想用C#实现它,我假设是winform,那么你的请求将在事件内部处理。假设在您的游戏中您选择菜单“加载游戏”,然后需要在其中显示保存的游戏数据。

以下示例只是一个说明,因此请预期非现实生活中的逻辑也适用。 Controller 将类似于:

public class SaveDataController
{
    public SaveData[] GetSaveData()
    {
        return Model.GetSaveData();
    }
}

用户界面将如下所示:

public void LoadGameButton_Click(object sender, EventArgs e)
{
    SaveDataController controller = new SaveDataController();
    SaveData[] saveData = controller.GetSaveData();
    SaveDataList.DataSource = saveData;
}

此示例显示对 Controller 的请求是在按钮单击事件中发起的。

正如其他人已经说过的,MVC 架构不适合非 Web 应用程序(或事件驱动),因为它不处理事件方法。大多数 UI 逻辑将在事件中处理。

关于c# - 在MVC模式中,如何实现类之间的通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473477/

相关文章:

c# - 包装一个在 c# 中实现回调的 native 库

php - Kohana - 你把 AJAX 脚本放在哪里?

带有闭包解释的 Javascript Singleton

ruby-on-rails - 将 Rails 与 Comet 服务器集成的设计模式

c# - 实现 ICollectionViewLiveShaping

c# - 获取文本文件的 mime

perl - 终端中的键盘事件

JavaScript 附加事件

c# - 接口(interface)中的内部成员

c# - 在 LINQ2DataSet 中指定返回行