Asp.net mvc 3 领域驱动设计令人困惑

Asp.net mvc 3 领域驱动设计令人困惑,asp.net-mvc-3,design-patterns,domain-driven-design,Asp.net Mvc 3,Design Patterns,Domain Driven Design,1) 什么是BLL服务?它们与服务层服务有什么区别?什么进入域服务,什么进入服务层 2) 为什么我重构BBL模型来给它一个行为:Post实体拥有一个反馈集合,它已经可以通过feedbacks.add(Feedback)添加另一个Feedback。显然,在普通的博客应用程序中没有计算。我是否应该定义一种方法来在Post实体中添加反馈?或者这种行为应该由相应的服务来控制 3) 我应该像中描述的那样使用工作单元(和工作单元存储库)模式,还是使用NHibernate会话就足够了?在NHibernate会

1) 什么是
BLL服务
?它们与
服务层
服务有什么区别?什么进入域服务,什么进入服务层

2) 为什么我重构BBL模型来给它一个行为:
Post
实体拥有一个反馈集合,它已经可以通过
feedbacks.add(Feedback)
添加另一个
Feedback
。显然,在普通的博客应用程序中没有计算。我是否应该定义一种方法来在
Post
实体中添加
反馈
?或者这种行为应该由相应的服务来控制


3) 我应该像中描述的那样使用
工作单元
(和
工作单元存储库
)模式,还是使用
NHibernate会话
就足够了?

在NHibernate会话的顶部不需要工作单元模式:

1)
业务层
服务层
实际上是同义词。“官方”DDD术语是
应用层

应用层的作用是协调
域服务
域模型
之间的工作。例如,这可能意味着应用程序函数首先通过
存储库加载一个实体,然后对该实体调用一个方法来执行实际工作

2) 有时,当您的应用程序主要是数据驱动的时候,构建一个功能齐全的
域模型似乎有些过火。然而,在我看来,当你习惯了
领域模型时,这是你唯一想走的路

Post
Feedback
案例中,您从一开始就需要
AddFeedback(Feedback)
方法,因为它会减少耦合(例如,您不必知道
Feedback
项是存储在
列表中还是存储在
哈希表中)它将为您提供一个很好的扩展点。如果您想要添加一项检查,以确保不允许超过10个
反馈
项,该怎么办。如果您有一个
AddFeedback
方法,您可以轻松地将检查添加到一个点中


3)
UnitOfWork
Repository
模式是DDD的基本组成部分。我不是NHibernate专家,但在接口后面隐藏特定于基础设施的细节总是一个好主意。这将减少耦合并提高可测试性

我建议您首先阅读DDD书籍,或者对DDD的构建模块有一个基本的理解。没有BLL服务或服务层服务。在DDD中,您有

  • 域层(域对象所在的软件的核心)
  • 应用程序层(协调应用程序)
  • 基础结构层(用于持久性、消息发送…)
  • 表示层
所有这些层中都可以有服务。一个服务只是为许多其他对象提供行为,它没有状态。例如,域层服务是您放置不属于任何特定域实体和/或许多其他对象所需的内聚业务行为的地方。它提供的操作的输入和输出通常是域对象

无论如何,无论何时,只要从域的角度来看某个操作似乎完全适合某个实体(例如,将反馈添加到post,这将转换为post.AddFeedback()或post.Feedbacks.Add()),我总是这样做,而不是添加一个只会将行为分散在不同地方并逐渐导致贫血的领域模型的服务。也可能有例外,比如向帖子添加反馈时需要在许多不同对象之间建立连接,但这里显然不是这样