L-F*_*our 10 c# architecture asp.net-mvc cqrs asp.net-mvc-3
我正在分析一个可能很大的网站,我有很多问题.
该网站将使用剃刀视图引擎在ASP.NET MVC 3中编写.在大多数示例中,我发现控制器直接使用底层数据库(使用域/存储库模式),因此中间没有WCF服务.我的第一个问题是:这个架构是否适合拥有大量流量的大型网站?总是可以对网站进行负载平衡,但这是一个好方法吗?或者我应该使网站使用与数据交互的WCF服务?
问题2:我想采用CQS原则,这意味着我想将查询与指挥部分分开.因此,这意味着查询部分将具有与命令部分不同的模型(针对视图进行优化)(针对业务意图进行优化并且仅包含完成命令所需的属性) - 但两者都作用于同一数据库.你认为这是个好主意吗?
感谢您的建议!
对于可伸缩性,它有助于将后端代码与前端代码分开.因此,如果您将UI代码放在MVC项目中,并在一个或多个单独的WCF和业务逻辑项目中尽可能多地处理代码,那么您的代码不仅会更清晰,而且还能够独立地扩展层/层.其他.
CQRS非常适合高流量网站.我认为CQRS与DDD的良好基础库正确结合,即使对于低流量站点也是如此,因为它使业务逻辑更容易实现.从架构的角度来看,将数据分离为读优化模型和写优化模型也是有意义的,因为它使更改变得更容易(可能还有一些工作,但在不破坏某些内容的情况下更容易进行更改).
但是,如果两者都作用于同一个数据库,我会确保读取模型完全由Views组成,这样您就可以根据需要修改实体而不会破坏Read代码.这样做的好处是你需要编写更少的代码,但你的写模型仍然包含一个完整的实体模型,而不仅仅是一个事件存储.
编辑回答您的额外问题:
我喜欢做的是为读模型使用WCF数据服务.此技术(特定于.NET 4.0)在数据模型(如Entity Framework EDMX)之上构建OData(= REST + Atom with LINQ support)Web服务.
因此,我在SQL Server(视图)中构建一个Read模型,然后从中构建一个Entity Framework模型,然后在只读模式下构建一个WCF数据服务.听起来比这复杂得多,只需几分钟.您不需要创建另一个模型,只需将EDMX公开为只读.另请参见http://msdn.microsoft.com/en-us/library/cc668794.aspx.
Command服务只是一个单向的常规WCF服务,Read服务是WCF数据服务,并且您的MVC应用程序都使用它们.