分层
- 领域模型层
Domain
:定义领域模型的地方,这里面会有不同的聚合、领域事件,其中不同的聚合下面就是领域模型 - 基础设施层
Infrastructure
:仓储层和一些共享代码的实现、领域模型与数据库之间的映射关系 - 应用层
Application
:API和后台任务Web API
也分类一些目录:- Application:项目使用了
CQRS
模式,即命令与查询职责分离,所以我们会把命令放在一个目录,查询放在一个目录,还有两个事件处理的目录,一个是领域模型中领域事件的处理,一个是集成事件的处理 - Controllers:主要就是定义
Web
- Extensions:将服务注册进容器的代码和中间件配置的代码,就是
ServiceCollection
和ApplicationBuilder
的扩展 - Infrastructure:身份认证、缓存等与基础设施交互的代码
- Application:项目使用了
- 共享层
Share
- GeekTime.Core –主要是承载基础简单的类型,比如自定义异常类,一下帮助类
- GeekTime.Domain.Abstractions –领域抽象层,定义领域模型的一些基类、接口、领域事件的接口、领域事件处理的接口、Entity的接口和Entity的基类
- GeekTime.Infrastructure.Core –基础设施核心层,可以仓储和
EFContext
定义一些共享的代码
共享层的代码是在所有项目里面都可以共享的,所有建议的做法是把这些代码通过私有的NuGet
仓库来存储,然后其他工程可以使用NuGet
包来直接引用即可
各层之间的依赖关系:
- 共享层:这个层不依赖解决方案中其他层
- GeekTime.Core:不依赖任何其他工程
- GeekTime.Domain.Abstractions:不依赖任何其他工程
- GeekTime.Infrastructure.Core:依赖领域模型的抽象层
GeekTime.Domain.Abstractions
- 领域模型层:
- 我们的领域模型是需要继承我们定义的模型基类,并且实现一个聚合根的接口,表示它是一个聚合根
- 领域事件就需要我们实现一个领域事件的机口
- 基础设施层:
- 定义仓储和仓储的实现,仓储的定义实际上依赖了基础设施核心层
GeekTime.Infrastructure.Core
里的仓储定义,这样就能复用仓储层的代码 - 数据库访问的实现:继承了我们自己定义的
EFContext
- 事务处理的对象:这个对象是来管理我们整个应用程序的请求上下文的事务,这样就可以让我们避免去手动的处理事务,简化我们的代码
- 定义仓储和仓储的实现,仓储的定义实际上依赖了基础设施核心层
- 应用层:
- 依赖基础设施层,基础设施层又依赖领域层,应用层实际上是把各层组装在一起的一层,它是我们应用程序的一个宿主,我们协调各层之间的关系,以及组装的代码都在这里实现
总结
- 领域模型专注业务的实现,不依赖仓储等基础设施层
- 基础设置的仓储层仅负责领域模型的取出和存储
- 使用
CQRS
模型设计应用层 Web API
是面向前端的交互接口,避免依赖领域模型- 将共享代码设计为共享包,使用私有
NuGet
仓库来分发管理