.NET Core开发实战课程备忘(18) -- 微服务之工程结构概览:定义应用分层及依赖关系

分层

  • 领域模型层Domain:定义领域模型的地方,这里面会有不同的聚合、领域事件,其中不同的聚合下面就是领域模型
  • 基础设施层Infrastructure:仓储层和一些共享代码的实现、领域模型与数据库之间的映射关系
  • 应用层Application:API和后台任务
    • Web API也分类一些目录:
      • Application:项目使用了CQRS模式,即命令与查询职责分离,所以我们会把命令放在一个目录,查询放在一个目录,还有两个事件处理的目录,一个是领域模型中领域事件的处理,一个是集成事件的处理
      • Controllers:主要就是定义Web
      • Extensions:将服务注册进容器的代码和中间件配置的代码,就是ServiceCollectionApplicationBuilder的扩展
      • Infrastructure:身份认证、缓存等与基础设施交互的代码
  • 共享层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仓库来分发管理