1

所以我的问题与这个问题非常相关:使用存储库和实体框架的领域事件中的实体持久性?

编辑:关于该主题的更好的讨论也在这里:在哪里引发依赖于持久性的域事件 - 服务、存储库或 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 相关)

我将举一个我在简介中写的最后一个参考的简单示例:

领域层有以下代码:

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);

线入是如何发生的?我猜是结构图,但是这个输入代码看起来如何呢?

4

2 回答 2

4

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

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

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

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

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

有关如何实现域事件发布/订阅系统的详细信息,请查看此处

于 2012-11-13T00:32:23.150 回答
3

我的第一个建议是摆脱的概念,让自己熟悉六边形架构的概念,即端口和适配器

使用这种方法,更容易理解域模型如何保持独立于任何周围的关注点。基本上这是架构级别的面向对象。图层是程序化的。

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

于 2012-11-12T09:10:36.313 回答