【问题标题】:How to Command Query Responsibility Segregation (CQRS) with ASP.NET MVC?如何使用 ASP.NET MVC 命令查询职责分离 (CQRS)?
【发布时间】:2011-01-24 22:49:00
【问题描述】:

我一直在阅读有关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/

【问题讨论】:

    标签: asp.net-mvc nhibernate orm cqrs


    【解决方案1】:

    请查看我在 CodePlex 上的 DDDsample.Net 项目。 GUI 使用 ASP.NET MVC 实现,而业务逻辑使用 DDD 实践,有 4 种不同的变体:

    • 经典(无 CQRS)
    • 具有两个 NHIbernate 关系数据存储的 CQRS
    • 在报告端使用 LINQ to SQL 的 CQRS
    • 在命令端使用事件溯源的 CQRS

    【讨论】:

      【解决方案2】:

      Cqrs 使 Web 项目更容易。在获取站点上,所有查询看起来像 “从 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)来使其更有趣。

      【讨论】:

      • 看起来很简单,因为你不关心你的命令结果,你应该关心任何系统中失败的命令。对代码不负责总是让事情变得更容易。
      【解决方案3】:

      看看我在http://agrcqrs.codeplex.com 的尝试,它是 ASP.NET MVC + NHibernate

      【讨论】:

        【解决方案4】:

        这是我为my CQRS lib Scritchy写的一个完整的例子:

        使用the Scritchy nuget package 创建您的 CQRS 应用非常简单,gets you up and running in a few minutes

        【讨论】:

          【解决方案5】:

          在以下帖子中,您可能会发现有趣的资源:@​​987654321@

          我发现特别有趣的是来自微软的CQRS Journey。它对 Windows Azure 的依赖可能看起来令人失望,但是等等……它在 SQL Server 中很好地实现了事件存储和企业服务总线。您会在 Demo App 源代码中找到很多 cmets,它们会警告您不要在生产中使用 SQL 实现……但是通过一些调整,您可以使其适应您的项目。我做到了,而且效果非常好。

          代码很干净(来自微软模式和实践的人)。您将找到一个很好的示例,说明如何使用依赖注入(使用 Unity)、简单但有效的企业服务总线(使用 SQL Server 和 ADO.NET,使用并行线程)、使用实体框架的读取模型等等。我从中学到了如何做 CQRS 和事件溯源......记住:这都是关于事件的

          【讨论】:

            【解决方案6】:

            这有点迟了,但它可能对正在寻找如何在 ASP.NET Core 中实现 CQRS 架构模式但没有找到任何合适的中间件的人有所帮助。 在我的发现过程中,我决定分享我的发现并最终写了一系列关于如何通过 HTTP 进行 CQRS 的文章。

            1. CQRS: Intro
            2. CQRS: Commanding via HTTP
            3. CQRS: Querying via HTTP

            除了理论方面,在编写过程中,我设法构建了两个即用型独立中间件,旨在帮助您在 ASP NET Core 项目中采用 CQRS。 HTTP CommandingHTTP Querying

            希望对您有所帮助,如果您有任何问题,请不要犹豫,给我留言。

            【讨论】:

              猜你喜欢
              • 2021-12-31
              • 1970-01-01
              • 2011-02-10
              • 2017-06-11
              • 2022-01-10
              • 1970-01-01
              • 2021-12-19
              • 2019-04-09
              • 1970-01-01
              相关资源
              最近更新 更多