实现领域驱动设计 - 使用ABP框架 - 解决方案概览

.NET解决方案的分层

下图显示了使用ABP的 应用启动模板 创建的Visual Studio解决方案:

b6ba8de44545470e842baa09a8025e68.png

解决方案名称为问题跟踪,它由多个项目组成。通过考虑DDD原则以及开发和部署实践,该解决方案是分层的。下面的小节解释了解决方案中的项目

领域层

领域层分为2个项目

  • IssueTracking.Domain 是基本的领域层,它包含前面介绍的所有构建块(实体、值对象、域服务、规范、存储库接口等)
  • IssueTracking.Domain.Shared 是一个很单薄的项目,它包含一些属于领域层的类型,但与所有其他层共享。例如,它可能包含一些与领域对象相关的常量和枚举,但需要被其他层重用

应用层

应用层也分为2个项目

  • IssueTracking.Application.Contracts 包含应用程序服务接口和这些接口使用的dto。这个项目可以被客户端应用程序共享(包括UI)
  • IssueTracking.Application 是实现Contracts项目中定义的接口的基本应用程序层。

表示层

  • IssueTracking.Web 是一个ASP.NET Core MVC / Razor Pages 应用程序, 这是唯一为应用程序和api服务的可执行应用程序

远程服务层

  • IssueTracking.HttpApi 项目包含解决方案定义的HTTP接口。它通常包含MVC控制器和相关模型。因此,您可以在这个项目中编写HTTP接口。
  • IssueTracking.HttpApi.Client 当您有一个需要使用HTTP接口的c#应用程序时,此项目是有用的。一旦客户端应用程序引用了这个项目,它就可以直接注入和使用应用程序服务。这得益于ABP框架的 动态c#客户端API代理系统

友情提示: There is a Console Application in the test folder of the solution,named IssueTracking.HttpApi.Client.ConsoleTestApp. It simply uses the IssueTracking.HttpApi.Client project to consume the APIs exposed by the application. It is just a demo application and you can safely delete it. You can even delete the IssueTracking.HttpApi.Client project if you think that you don't need to them.

基础设施层

在DDD实现中,您可能有一个单一的基础设施项目来实现所有的抽象和集成,或者您可能对每个依赖项有不同的项目

我们建议采取一种平衡的方法;为主要的基础设施依赖项(如 Entity Framework Core)创建单独的项目,为其他基础设施创建一个通用的基础设施项目

ABP的启动解决方案有两个 Entity Framework Core 集成项目

  • IssueTracking.EntityFrameworkCore 它是EF Core的基本集成包。你的应用程序的DbContext,数据库映射,存储库的实现和其他EF Core相关的东西都在这里
  • IssueTracking.EntityFrameworkCore.DbMigrations 是一个管理Code First数据库迁移的特殊项目。在这个项目中有一个单独的DbContext来跟踪迁移。除了需要创建一个新的数据库迁移或添加一个具有一些数据库表的 应用程序模块 并自然需要创建一个新的数据库迁移外,您通常不会过多地涉及这个项目

你可能想知道为什么 EF Core 会有两个项目。它主要与 模块化 有关。每个模块都有自己独立的DbContext,应用程序也有一个DbContext。DbMigrations项目包含一个模块的联合,用于跟踪和应用单个迁移路径。虽然大多数时候你不需要知道它,但你可以查看 EF Core迁移文档 以获得更多信息

其他项目

还有一个项目,IssueTracking.DbMigrator,这是一个简单的控制台应用程序,它执行迁移数据库和 播种 初始数据。这是一个有用的实用程序应用程序,您可以在开发环境和生产环境中使用它。

解决方案中项目的依赖关系

下图显示了解决方案(IssueTracking)中项目之间的基本依赖关系(项目引用)。IssueTracking部分因为简单没显示)


ece045cdae9a48ce88f6c5a94cc3f329.png

这些项目之前已经解释过了。现在,我们可以解释依赖关系的原因

  • Domain.Shared 是所有其他项目直接或间接依赖的项目。此项目里的所有类型均可被其他项目使用。
  • Domain 只依赖 Domain.Shared。因为它已经是领域共享的一部分。例如,Domain.Shared 中的 IssueType 枚举 可以被 Domain 项目中的 Issue 实体使用
  • Application.Contracts 依赖 Domain.Shared。通过这种方式,您可以在dto中重用这些共享的类型。比如, 在Domain.Shared中的IssueType 枚举 可以作为 CreateIssueDto 的一个属性
  • Application 依赖 Application.Contracts 。因为它实现了应用程序服务接口并使用其中的dto。它还依赖于 Domain,因为应用程序服务被实现为使用在领域层中定义的领域对象
  • EntityFrameworkCore 依赖 Domain。因为它将领域对象(实体和值类型)映射到数据库表(因为它是一个ORM),并实现领域中定义的存储库接口
  • HttpApi 依赖 Application.Contracts。 因为它里面的 controller 会注入和使用应用服务接口
  • HttpApi.Client 依赖 Application.Contracts。因为它可以像前面解释的那样使用应用程序服务
  • Web 依赖 HttpApi。因为它提供在其内部定义的HTTP接口。而且,通过这种方式,它间接地依赖于 Application.Contracts 项目, 来使用页面/组件中的应用程序服务

基于DDD的应用程序的执行流程

下图显示了基于DDD模式开发的web应用程序的典型请求流

86dfffd246784c78bf62dfdaab876dd3.png
  • 请求通常从UI上的用户交互(用例)开始,该用户交互导致向服务器发出HTTP请求
  • 表现层(或分布式服务层)中的MVC控制器或Razor页面处理程序处理请求,并可以在此阶段执行一些横切关注点(授权、验证、异常处理等)。控制器/页面注入相关的应用程序服务接口,并通过发送和接收dto调用其方法
  • 应用程序服务使用领域对象(实体、存储库接口、领域服务等)来实现用例。应用层实现一些横切关注点(授权、验证等)。应用程序服务方法应该是一个工作单元。这意味着它应该是原子的。
  • 大多数横切关注点都是由ABP框架自动且常规地实现的,通常不需要为它们编写代码
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容