如何在多层应用程序中连接域事件处理程序

时间:2012-11-12 09:03:26

标签: asp.net asp.net-mvc domain-driven-design domain-events

所以我的问题与这个问题非常相关:Entity persitance inside Domain Events using a repository and Entity Framework?

编辑:关于这个主题的更好的讨论也在这里:Where to raise persistence-dependent domain events - service, repository, or UI?

然而,假设我采取了正确的方法,我的问题就更简单和技术性了。

假设我有以下项目:

MyDomainLayer -> very simple classes, Persitence Ignorance, a.k.a POCOs
MyInfrastructureLayer -> includes code for repositories, Entity Framework
MyApplicationLayer -> includes ASP.Net MVC controllers 
MyServicesLayer -> WCF-related code 
MyWebApplication -> ASP.Net MVC (Views, Scripts, etc)

引发事件时(例如,已授予组成员资格), 然后应该完成两件事(在两个不同的层中):

  1. 要保留数据(在数据库中插入新的组成员资格记录)
  2. 为相关用户创建通知(与UI相关)
  3. 我将简要介绍我在介绍中写的最后一篇文章:

    域层具有以下代码:

    public void ChangeStatus(OrderStatus status)
    {
        // change status
        this.Status = status;
        DomainEvent.Raise(new OrderStatusChanged { OrderId = Id, Status = status });
    }
    

    让我们假设通风处理程序在MyApplicationLayer中(以便能够与服务层通信)。 它具有以下代码:

    DomainEvent.Register<OrderStatusChanged>(x => orderStatusChanged = x);
    

    接线如何发生?我想是在使用structuremap,但是这个接线代码看起来是什么样的?

2 个答案:

答案 0 :(得分:4)

首先,您的分层并不完全正确。更正:

应用程序层 - ASP.NET MVC控制器通常被认为是在应用程序层和HTTP / HTML之间形成适配器。因此,控制器本身不是应用层的一部分。应用层中的内容是应用服务。

MyServicesLayer - 与WCF相关的代码。 WCF实现的服务是Dennis Traub引用的六边形体系结构中的适配器。

MyWebApplication - ASP.Net MVC(视图,脚本等)。同样,这形成了六边形体系结构的适配器。 MVC控制器也属于这里 - 实际上它们是这个适配器的实现细节。该层与使用WCF实现的服务层非常相似。

接下来,您将描述响应事件应该发生的两件事。持久性通常通过在事务中提交工作单元来实现,而不是作为响应事件的处理程序来实现。此外,应在持久性完成后,或者换句话说,在提交事务之后进行通知。这最好以最终一致的方式完成,这种方式不在首先生成域事件的工作单元之外。

有关如何实现域事件pub / sub系统的详细信息,请查看here

答案 1 :(得分:3)

我的第一个建议,摆脱图层的概念,让自己熟悉Hexagonal Architecture a.k.a. Ports and Adapters的概念。

通过这种方法,可以更容易地理解域模型如何保持独立于任何周围的问题。基本上,这是在架构层面上的面向对象。图层是程序性的。

对于您的特定问题,您可以创建一个项目,其中包含将事件投影到数据库中的事件处理程序。这些处理程序可以直接访问数据库或通过ORM。您可能不需要任何存储库,因为事件应包含所需的所有信息。