序言:这个问题与 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/