所以我的问题与这个问题非常相关: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)
引发事件时(例如,已授予组成员资格), 然后应该完成两件事(在两个不同的层中):
我将简要介绍我在介绍中写的最后一篇文章:
域层具有以下代码:
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,但是这个接线代码看起来是什么样的?
答案 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。您可能不需要任何存储库,因为事件应包含所需的所有信息。