.NET MVC 5和洋葱架构

3
我正在写一个大项目,想要在其中应用领域驱动设计(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 - 应用程序服务(但我不知道该把实现放在哪里)

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

  • XXX.Web.Ui - MVC5应用程序

但是我不明白我应该把这些东西放在哪里: IMessagesService.cs(针对模型Messages的业务逻辑层),MessagesService.cs(针对模型Messages的业务逻辑层),SessionHelper.cs,MessageMapping.cs,IMailerService.cs,MailerService.cs
另外:我应该把IRepository和GenericRepository(impl)放在哪里?

类似于https://dev59.com/rmMl5IYBdhLWcg3wuZDL#18168046的问题。 - Yugang Zhou
1个回答

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

enter image description here

但是SessionHelperMessageMapping看起来像是与DataAccess相关的基础设施,应该放在靠近数据访问组件的位置。

此外,我会将所有的领域实体和领域服务放入单个项目Domain Model中。这样你的领域逻辑就不会被分割成两个项目,XXX.Domain.EntitiesXXX.Domain.Services,以便将所有的领域逻辑分组。

编辑:

在文章"Services in Domain-Driven Design (DDD)"中有一个很好的区分领域服务和应用程序服务的列表:

域服务非常细粒度,而应用程序服务是旨在提供API的外观。域服务包含不能自然放置在实体或值对象中的领域逻辑,而应用程序服务编排执行领域逻辑,并且本身不实现任何领域逻辑。域服务方法可以有其他领域元素作为操作数和返回值,而应用程序服务则操作于诸如标识值和基本数据结构之类的微不足道的操作数。应用程序服务声明对执行领域逻辑所需的基础设施服务的依赖项。命令处理程序是应用程序服务的一种类型,通常在CQRS架构中专注于处理单个命令。

我应该把IMailerService和MailerService(impl)放在哪里? - Zilberman Rafael
通常情况下,MailerService/IMailerService 是应用服务的一部分。但是,如果需要在域模型中访问 IMailerService,您可以创建另一个项目(例如 Core),其中包含核心接口,并从其他项目中引用它。 - Ilya Palkin
那么我应该把MailerService放在哪个项目中呢? - Zilberman Rafael
假设 XXX.Services - Ilya Palkin
那么应用程序服务应该在XXX.Services中,领域逻辑应该在XXX.Domain.Services中? - Zilberman Rafael
是的,应用程序服务应该在XXX.Services中。但我不会将领域逻辑分成XXX.Domain.EntitiesXXX.Domain.Services,因为领域服务只是“包含不能自然地放置在实体中的领域逻辑”。 - Ilya Palkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接