【问题标题】:.NET MVC 5 and Onion Architecture.NET MVC 5 和洋葱架构
【发布时间】:2014-01-25 11:37:32
【问题描述】:

我正在编写大型项目,我想在其上应用领域驱动设计 (DDD)。这是我的项目和解释:

  • XXX.Domain.Entities - POCO(普通旧 C# 对象)类(例如:Message.cs)
  • XXX.Domain.Services - 域的服务

  • XXX.Infrastructure - 基础设施接口

  • XXX.Infrastructure.Concrete - 来自 XXX.Infrastructure 的接口的实现
  • XXX.Infrastructure.DI - 依赖注入模块(例如:RepositoryModule.cs)

  • XXX.Services - 应用程序的服务(但我不知道把 impl 放在哪里)

  • XXX.Tests - 单元测试(例如:SomeTest.cs)

  • XXX.Web.Ui - MVC5 应用

但我不明白我应该把其中任何一个放在哪里: IMessagesService.cs(模型消息的BL),MessagesService.cs(模型消息的BL),SessionHelper.cs,MessageMapping.cs,IMailerService.cs,MailerService.cs

另外:我应该把 IRepository 和 GenericRepository (impl) 放在哪里?

【问题讨论】:

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


【解决方案1】:

如果您想组织您的应用程序服务,您可以简单地将所有实现放入 XXX.Services 项目中的文件夹 Impl。您有一个选项,而不是仅为实现创建新项目。

但是SessionHelperMessageMapping 看起来像DataAccess 特定的基础架构,应该靠近您的数据访问组件。

另外,我会将所有域实体和域服务放入单个项目Domain Model。在这种情况下,您的域逻辑不会在 XXX.Domain.EntitiesXXX.Domain.Services 这两个项目之间拆分,因此您的所有域逻辑都会分组。

编辑:

"Services in Domain-Driven Design (DDD)" 帖子中有一个很好的域服务和应用程序服务之间差异的列表:

  • 领域服务非常精细,因为应用程序服务是一个旨在提供 API 的外观。
  • 域服务包含不能自然地放置在实体或值对象中的域逻辑,而应用程序服务协调域逻辑的执行,并且本身不实现任何域逻辑。
  • 域服务方法可以将其他域元素作为操作数和返回值,而应用程序服务对诸如标识值和原始数据结构等普通操作数进行操作。
  • 应用服务声明对执行域逻辑所需的基础设施服务的依赖关系。
  • 命令处理程序是一种应用服务,专注于处理通常在 CQRS 架构中的单个命令。

【讨论】:

  • 我应该把 IMailerService 和 MailerService (impl) 放在哪里?
  • 通常MailerService'/IMailerService` 是应用程序服务的一部分。但是,如果需要在域模型中访问IMailerService,您可以创建另一个具有核心接口的项目(例如 Core)并从其他项目中引用它。
  • 那我应该把MailerService放在什么项目里?
  • 假设XXX.Services
  • 那么应用服务应该在XXX.Services中,域逻辑在XXX.Domain.Services中?
猜你喜欢
  • 2011-10-09
  • 2022-09-24
  • 2014-10-15
  • 1970-01-01
  • 2014-06-22
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多