我正在编写大项目,我想在其上应用域驱动设计(DDD)。这是我的项目和解释:
XXX.Domain.Services - 域名服务
XXX.Infrastructure - Infrastructure Interfaces
XXX.Infrastructure.DI - 依赖注入模块(例如:RepositoryModule.cs)
XXX.Services - 应用程序的服务(但我不知道将impl放在哪里)
XXX.Tests - 单元测试(例如:SomeTest.cs)
XXX.Web.Ui - MVC5 app
但我无法理解我应该把这些人放在哪里: IMessagesService.cs(模型消息的BL),MessagesService.cs(模型消息的BL),SessionHelper.cs,MessageMapping.cs,IMailerService.cs,MailerService.cs
另外:我应该在哪里放置IRepository和GenericRepository(impl)?
答案 0 :(得分:1)
如果要组织应用程序服务,可以将所有实现简单地放在Impl
项目中的文件夹XXX.Services
中。有一个选项,而不是仅为实现创建新项目。
但SessionHelper
和MessageMapping
看起来像DataAccess
特定的基础架构,应该靠近您的数据访问组件。
另外,我会将所有域实体和域服务放入单个项目Domain Model
中。在这种情况下,您的域逻辑不会在两个项目XXX.Domain.Entities
和XXX.Domain.Services
之间拆分,以便您的所有域逻辑都会分组。
编辑:
在帖子"Services in Domain-Driven Design (DDD)"中,域名服务和应用程序服务之间存在很好的差异列表:
- 域服务非常精细,因为应用程序服务是提供API的外观。
- 域服务包含无法自然放置在实体或值对象中的域逻辑,而应用程序服务则协调域逻辑的执行,而不是自己实现任何域逻辑。
- 域服务方法可以将其他域元素作为操作数和返回值,而应用程序服务则根据诸如标识值和原始数据结构之类的简单操作数进行操作。
- 应用程序服务声明对执行域逻辑所需的基础结构服务的依赖性。
- 命令处理程序是一种应用程序服务,专注于处理通常在CQRS体系结构中的单个命令。