2012-11-12 59 views
1

所以我的问题是非常与此相关的一个: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相关的)

我要最后引用我在介绍中写了一个简单的例子:

领域层具有下面的代码:

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

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

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

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

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

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

有关如何实施域事件pub/sub系统的细节,请看看here

+0

荣誉eulerfx和丹尼斯,非常感谢你,这是一个架构的速成课程。我想我有一些功课要做,并阅读这个六角形建筑。非常感谢。 –

3

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

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

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

+0

非常感谢丹尼斯,它看起来非常有趣,我希望我能给你一个投票,不幸的是我不能(新手在这里)。但我更新了我的问题,也许你能帮助我? –

+0

我希望不是太晚,谢谢你的评论:) –

+0

@JorgeAlvarado它永远不会太晚了谢谢:) –

相关问题