【问题标题】:In client side MVC, who should handle client-server communication?在客户端 MVC 中,谁应该处理客户端-服务器通信?
【发布时间】:2013-05-30 06:16:05
【问题描述】:
我正在开发客户端/服务器产品。基本上,服务器会将文档传输到客户端进行编辑。客户端具有完整的 MVC 架构。文件就是模型。
现在的问题是:
- 模型中有一些计算需要服务器中的一些资源。
- 出于性能原因,模型的某些部分应该延迟加载。
一个例子是文档中的图像。打开文档时它没有加载,但是有一些东西会加载图像,一旦加载它就会让文档知道并且文档会重新计算布局。
我的问题是通信代码是模型还是控制器的一部分?或者它属于某个既不是模型也不是控制器的上下文?还是上下文属于模型?
【问题讨论】:
标签:
web-services
model-view-controller
architecture
【解决方案1】:
模型层应该与数据源交互。在客户端-服务器设置的情况下,您有两个独立的三元组,客户端模型层的数据源将是服务器的表示层。
基本上,您客户端的模型层成为服务器端的user。
【解决方案2】:
如果能提供一些计算示例或文档对象模型就更好了。
让我们突破需求:
-
模型中有一些计算需要服务器中的一些资源。
这种计算最好放在Model,因为它需要来自服务器的资源。如果你把逻辑放在Controller上,那么:
- Controller 需要访问服务器(数据库),这违反了 MVC 规则。另一件事是,控制器现在知道连接(字符串或物理文件存储)。如果您添加另一个适配器/网桥,则需要额外的努力
- 该计算不能应用于其他 UI 实现。说在.Net中,你把它放在Asp.Net MVC中并在Controller处添加计算。如果有时您需要支持桌面 UI,则无法按原样使用计算(因为已经被控制器操作污染,添加了无用的 Web 依赖等)
-
出于性能原因,模型的某些部分应该延迟加载。
我不确定您的目标。但是让我们经历一下。我假设您有 Header 模型,其中 List 或 Details 需要延迟加载。这可以通过2种方法来实现。
第一种方法是在Details 属性上实现延迟加载,第二种方法是检索由特定Header 或id 给出的Details 列表,从存储库中检索。他们俩的结果都是一样的。恕我直言,我更喜欢第二个,因为通过以后的解决方案,您可以在其他模块中重用存储库,并使您能够选择 Details 而无需特定的 Header。展示位置,我认为应该在Model。
我可能误解了这个要求。