我一直在阅读Command Query Responsibility Segregation (CQRS)。我有点想知道如何使用ASP.NET MVC?我从概念上理解了CQRS,听起来不错,肯定会引入一些复杂性(事件和消息模式)与“普通/常见”方法相比。 CQRS的思想也在某种程度上反对使用ORM。我正在考虑如何在即将到来的项目中使用这种模式,所以如果有人有将CQRS与ASP.NET MVC和NHibernate结合的经验,请提供一些具体的例子来帮助我更好地理解CQRS并与ASP.NET MVC一起使用。谢谢!
更新: 我一直在浏览Mark的示例代码。如果您正在学习CQRS,那必须阅读。
http://github.com/MarkNijhof/Fohjin
http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/
http://cre8ivethought.com/blog/2009/11/28/cqrs-trying-to-make-it-re-usable/
答案 0 :(得分:25)
请查看我在CodePlex上的DDDsample.Net项目。 GUI使用ASP.NET MVC实现,而业务逻辑使用DDD实践,有4种不同的变体:
答案 1 :(得分:18)
Cqrs使Web项目变得更加容易。在获取网站上,所有查询都将如下所示 “select * from table where id = @id”)。对于那些简单的查询,您不需要像NHiberante这样的orm。您不必使用sql数据库,只要您愿意,您可以将对象序列化到数据库表,或使用命名约定。您仍然可以通过NHibernate查询读取数据库,但是您不会从中获得任何好处,因为您的所有查询都是相同的。
public class Controller
{
public ActionResult Get(Guid id)
{
var viewModel = reportingDatabase.Get(id);
return View(viewmodel);
}
}
在命令端,控制器将如下所示:
public class Controller
{
public ActionResult Post(SomeForm form)
{
// do validation
var command = new SomeCommand(form.Property1, form.Property2);
bus.Send(command);
return redirecto(something else);
}
}
控制器只是发送一条消息,它不知道消息的去向以及消息的结果。 mvc部分的编程非常简单。 Cqrs将使编写应用程序的Web部分非常无聊,但您可以通过添加一些帮助用户做出决策的代码(可选地返回ajax使用的json)来使其更有趣。
答案 2 :(得分:4)
看看我对http://agrcqrs.codeplex.com的尝试,即ASP.NET MVC + NHibernate
答案 3 :(得分:0)
以下是我为my CQRS lib Scritchy撰写的完整示例:
使用the Scritchy nuget package创建CQRS应用非常简单,gets you up and running in a few minutes
答案 4 :(得分:0)
在以下文章中,您可能会找到有趣的资源:How to adapt CQRS to projects
我觉得特别有趣的是来自微软的CQRS Journey。它对Windows Azure的依赖可能看起来令人失望,但等等......它在SQL Server中实现了非常好的事件存储和企业服务总线。您将在演示应用程序源代码中找到许多注释,警告您不要在生产中使用SQL实现......但是通过一些调整,您可以将其调整到您的项目中。我做到了,它非常,非常好。
代码很干净(来自Microsoft模式和实践的人员)。您将找到一个很好的示例,说明如何使用依赖注入(使用Unity),一个简单但有效的企业服务总线(使用SQL Server和ADO.NET,具有并行线程),具有实体框架的读取模型等等。我从中学到了如何进行CQRS和事件采购......记住:关于事件的全部内容
答案 5 :(得分:0)
这是一个较晚的响应,但是对于正在寻找如何在ASP.NET Core中实现CQRS架构模式的人来说可能会有所帮助,并且令人惊讶的是,没有找到合适的中间件来解决此问题。 在发现过程中,我决定分享我的发现,并最终撰写了一系列文章,介绍如何通过HTTP进行CQRS。
除理论上的观点外,在撰写过程中,我设法构建了两个易于使用的独立中间件,这些中间件旨在帮助您在ASP NET Core项目中采用CQRS。 HTTP Commanding和HTTP Querying。
希望有帮助,如果您有任何疑问,请不要犹豫,向我发送消息。