- A+
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。
前言
很久没更新这个系列。。。之前的章节中讲到ABP的模块是可以独立运行的,但是没有介绍具体怎么操作,本篇就来讨论一下模块如何独立运行,以及一些托管方式。本人也是处于摸索阶段,如有不对欢迎指出。
开始
模块运行
首先需要生成模块的数据库,修改HttpApi.Host
和IdentityServer
项目的appsettings.json
数据库连接字符串配置。
modulesfile-managementhostXhznl.FileManagement.HttpApi.Hostappsettings.json:
modulesfile-managementhostXhznl.FileManagement.IdentityServerappsettings.json:
这样会生成2个数据库,如果你只需要一个数据库的话,就把FileManagement
的那行配置去掉就好了。
打开程序包管理器控制台,默认项目选择IdentityServer
,执行update-database
执行完成会生成Main数据库,其中是一些ABP的基础表。
继续将默认项目设置为HttpApi.Host
执行add-migration Initial
update-database
执行完成会生成Module数据库,其中是你模块的相关表。
此时这两个项目就可以正常运行了。
项目中可能有多个模块相互协作,如果将各个模块独立运行的话,不可能每个模块都创建一个Main数据库,所以部分ABP的通用模块的数据库表就用同一个就好了。
modulesfile-managementhostXhznl.FileManagement.HttpApi.Hostappsettings.json:
modulesfile-managementhostXhznl.FileManagement.IdentityServerappsettings.json:
动态 C# API 客户端
当有多个独立部署的模块时,可能需要做一些网关之类的来统一入口,模块之间的相互调用也比较麻烦,本篇暂不讨论。下面介绍一下如何使用ABP的动态C# API客户端来调用远程模块。
ABP可以自动创建C# API 客户端代理来调用远程HTTP服务(REST APIS).通过这种方式,你不需要通过
HttpClient
或者其他低级的HTTP功能调用远程服务并获取数据.
前面的章节中,在主项目中将模块的Application
层和Domain
层的大部分项目都引用了一遍,那种方式是单体部署的情况,模块和主项目托管在同一个进程里。
下面使用C# API客户端来代理远程模块。
首先删除项目中模块的引用和DependsOn
然后在你需要调用模块的项目中,添加模块的HttpApi.Client
项目的依赖即可。比如我这里的Xhznl.HelloAbp.HttpApi.Host
项目:
然后DependsOn
:
然后在appsettings.json
中添加远程服务的地址配置:
其中的FileManagement
这个名称是来自模块的HttpApi.Client
项目中的定义:
接下来就可以像使用本地方法一样去使用远程服务了,因为HttpApi.Client
是依赖于Application.Contracts
项目的,所以你模块的所有服务接口都可以在这里使用,直接注入即可(前提是你的服务需要实现IRemoteService
),ABP会自动帮你完成Http的远程调用。随便找个地方测试一下:
接下来是模块项目,最好配合ABP的自动API控制器一起使用,如果你是自定义路由的话,可能会出现一些Could not found remote action
的奇怪错误。
Auth服务地址也注意一下:
下面给两个项目打上断点,测试一下流程是否正确:
可以看到,请求已经正常流转到模块项目中。
上面有些乱,总结一下重点:
- 添加
HttpApi.Client
引用 - 添加
RemoteServices
地址配置 - 注入服务接口进行使用
如果想托管模块的所有API,那么只需要再添加模块的HttpApi
依赖即可。托管方式非常灵活,具体可以参考:模块化架构最佳实践 & 约定
最后
本篇就到这里。。。。。。