gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:04:36 24 4
gpt4 key购买 nike

前言:这个问题不是关于 ASP.NET MVC 框架的。

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


在使用 MVC 模式构建某些东西时,我应该如何最好地将类与事件联系起来?

我想编写一些 MVC 代码,以便我可以了解有关设计模式的更多信息。我理解为什么模式的这三个元素中的每一个都应该分开,但我不确定如何实现将它们连接在一起。我正在用 C# 编写此代码,这也是我的新手,它让我印象深刻,应该使用事件。我主要不确定我应该如何正确订阅/取消订阅事件,我需要进行完整性检查。

例如,我将发布 View / Controller 类。在此示例中,View 想要发送 DataRequest 事件,而 Controller 想要订阅该事件以便将其传递给 Model。另一方面,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();
}
}

UI 会是这样的:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com