Asp.net mvc 对于一个大型网站,MVC风格的控制器的粒度是合适的?

Asp.net mvc 对于一个大型网站,MVC风格的控制器的粒度是合适的?,asp.net-mvc,design-patterns,granularity,Asp.net Mvc,Design Patterns,Granularity,我们我的团队和我有一个大的网络项目,将处理许多用户,至少15000个用户!。在精化阶段,我们决定用MVC风格编写代码。在这个项目中,我们面临一个权衡,所有的操作都应该由经过身份验证的用户执行 一种设计方法是:控制器获取请求,并根据请求从负责请求的DB对象创建负载,然后将该对象的引用保存到控制器,最后将控制器添加到用户会话中。这种风格需要控制器是一个粗粒度类,在用户的可能动作中具有多个行为,这些动作的频率很高 另一种设计方法可能是:控制器获取请求,然后为请求创建负责对象,但该控制器是无状态的,并且

我们我的团队和我有一个大的网络项目,将处理许多用户,至少15000个用户!。在精化阶段,我们决定用MVC风格编写代码。在这个项目中,我们面临一个权衡,所有的操作都应该由经过身份验证的用户执行

一种设计方法是:控制器获取请求,并根据请求从负责请求的DB对象创建负载,然后将该对象的引用保存到控制器,最后将控制器添加到用户会话中。这种风格需要控制器是一个粗粒度类,在用户的可能动作中具有多个行为,这些动作的频率很高

另一种设计方法可能是:控制器获取请求,然后为请求创建负责对象,但该控制器是无状态的,并且具有特定的行为,例如,根据网站的一个页面。通过这种方式,我们应该为每个页面创建一个控制器,如果它需要一些页面中常见的信息,我们必须从数据库或缓存中加载它们

在第一种样式中,由于减少了创建和垃圾收集,控制器应该是一个粗粒度对象,所以它在用户经过身份验证后只创建一次,并且在会话到期之前不会成为垃圾。会话中存在的对象的生命周期直到会话过期,所以我认为这可能会导致内存不足! 在第二种样式中,对于用户到其他页面的每次转换,应创建一个控制器,并从数据库中提取信息,这可能会导致性能问题! 我的要求:我想从内存使用和性能两个方面对它们进行比较!如果有任何建议,我真的很乐意提及

有关简单示例,请参见下图:


实际上,将站点划分为多个控制器与DB Access的观点没有区别,因为对象在整个会话中都是维护的。将站点拆分为多个控制器并不意味着您正在拆分会话。

大多数情况下,数据访问层决定了系统的性能,而mvc应用程序中控制器的大小几乎没有影响。从设计的角度来看,我建议您将逻辑上相关的操作保留在一个控制器中,这样您就可以拥有许多小型控制器。从性能的角度来看,您应该关注您的数据库访问,并找到它所属的优化。

我的经验法则是遵循

每个业务实体都是一种资源。资源应该有控制器

电子邮件、金钱等价值对象不是资源


在少数情况下,当简单性超过复杂性时,控制器应该合并。额外的控制器会增加,并且实体直接相关。

也许我这里遗漏了一些东西,但为什么要在会话中存储控制器?@KTF:我可以存储实体对象,而不是控制器,但我认为控制器不是一个大对象,它是几乎是无状态的,因此通过将其存储在会话中,可以减少对它的创建和破坏!您是否在控制器的构造/最终确定方法中执行大量数据I/O或密集型操作?否则,类本身的实际创建/销毁只会产生很少的开销。仍然不确定为什么要在会话中存储控制器。我假设您使用的是MVC方法?