【问题标题】:MVC - where to put communication codeMVC - 在哪里放置通信代码
【发布时间】:2012-08-20 16:03:11
【问题描述】:

我想尝试编写(这里是业余爱好者!)多人游戏,现在在设计时我决定使用 MVC 模式。
现在我的问题是:我应该把我的网络代码放在哪里?在模型或控制器中? (显然不是视图)

编辑: 抱歉,我的问题已经有数百次不清楚了。
游戏本身将是 MVC,它首先与服务器通信(查找玩家),然后与该玩家通信(轮到你并轮到其他人)。那我应该在哪里做呢?

【问题讨论】:

    标签: model-view-controller networking


    【解决方案1】:

    您可以将实际游戏本身放在一个新项目中,并在您的 MVC 应用程序之间引用它,这样您的游戏就与您的 Web 应用程序完全分离。例如,如果您想将其移植到 WPF,这可能会很有用。另一种选择是将游戏作为 Web 服务,MVC 应用程序从中请求信息,并为其他语言提供可扩展性以插入。

    但是,如果您决定将所有内容作为一个整体保留在 MVC 中,那么我建议您使用模型。

    作为细分:

    • 控制器负责处理所有 Web 请求,即 GET 和 POST。它还可以填充模型并为该请求返回适当的视图。

    • 模型包含要执行的域对象和逻辑(即从存储库中提取信息并处理要传递给视图的数据)。

    • 视图返回基于模型中存储的数据的标记。

    在某些实现中,检查条件和存储库调用等附加逻辑也发生在控制器级别,这是一种称为胖控制器瘦模型的技术。

    编辑:

    您应该向控制器发送请求。 IE。在您的游戏控制器中有一个HTTPPost 方法,该方法连接到服务器,然后向玩家发送回合信息并获取新信息。例如:

    [HttpPost]
    public ActionResult SendPlayerTurnInformation(PlayerObject player) 
    {
       // logic to connect to the Game Network
       // connection.UpdatePlayerTurn(player);
    
       //return success/fail
    }
    

    然后您可以执行相同操作来获取特定玩家回合信息,然后更新您的模型以传递到包含新信息的视图。

    【讨论】:

    • 小记:如果你的控制器是从模型层提取信息并将其传递给视图,那么你实际上是在实现 MVP。在经典的 MVC 和 Model2 MVC 设计模式中,视图是主动的,在 MVP 和 MVVM 中 - 它是被动的。
    • @tereško - 控制器不从模型中提取信息。根据我的描述,我将存储库称为数据库连接或游戏网络。我以胖控制器瘦模型为例,我个人没有使用这种方法实现解决方案。
    【解决方案2】:

    MVC 设计模式实际上是两层的组合:表示层和模型层。表示层通常处理用户界面(更新它并对用户的交互作出反应)。模型层处理领域业务逻辑和持久性。

    网络代码应该放在模型层。

    确切地说,在模型层处理持久性的部分,因为从业务逻辑的角度来看,数据的来源没有区别。它可以来自 SQL 数据库,来自打开的网络套接字或火星探测器上的探测器。这些都只是数据源,通常以data mappers 的形式实现,是模型层的一部分。

    【讨论】:

    • 是的,有什么问题吗?您也不仅仅是从 SQL 获取数据。很明显,模型层与存储介质的交互是双向的。
    • 嗯...认为 Darren Davies 的编辑更有意义。不过,+1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2015-10-31
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多