初识ABP vNext(12):模块的独立运行与托管

点击上方蓝字"小黑在哪里"关注我吧

  • 模块运行

  • 动态 C# API 客户端

前言

很久没更新这个系列。。。之前的章节中讲到ABP的模块是可以独立运行的,但是没有介绍具体怎么操作,本篇就来讨论一下模块如何独立运行,以及一些托管方式。本人也是处于摸索阶段,如有不对欢迎指出。

开始

模块运行

首先需要生成模块的数据库,修改HttpApi.HostIdentityServer项目的appsettings.json数据库连接字符串配置。

\modules\file-management\host\Xhznl.FileManagement.HttpApi.Host\appsettings.json:

\modules\file-management\host\Xhznl.FileManagement.IdentityServer\appsettings.json:

这样会生成2个数据库,如果你只需要一个数据库的话,就把FileManagement的那行配置去掉就好了。

打开程序包管理器控制台,默认项目选择IdentityServer,执行update-database

执行完成会生成Main数据库,其中是一些ABP的基础表。

继续将默认项目设置为HttpApi.Host执行add-migration Initial  update-database

执行完成会生成Module数据库,其中是你模块的相关表。

此时这两个项目就可以正常运行了。

项目中可能有多个模块相互协作,如果将各个模块独立运行的话,不可能每个模块都创建一个Main数据库,所以部分ABP的通用模块的数据库表就用同一个就好了。

\modules\file-management\host\Xhznl.FileManagement.HttpApi.Host\appsettings.json:

\modules\file-management\host\Xhznl.FileManagement.IdentityServer\appsettings.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服务地址也注意一下:

下面给两个项目打上断点,测试一下流程是否正确:

可以看到,请求已经正常流转到模块项目中。

上面有些乱,总结一下重点:

  1. 添加HttpApi.Client引用

  2. 添加RemoteServices地址配置

  3. 注入服务接口进行使用

如果想托管模块的所有API,那么只需要再添加模块的HttpApi依赖即可。托管方式非常灵活,具体可以参考:模块化架构最佳实践 & 约定[1]

最后

本篇就到这里。。。。。。

参考资料

[1]

模块化架构最佳实践 & 约定: https://docs.abp.io/zh-Hans/abp/latest/Best-Practices/Module-Architecture

如果本文对您有用,

不妨点个“”或者转发朋友圈支持一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端学习 - Spring5

文章目录一 简介二 IOC1 底层原理2 实现过程3 Spring 实现 IOC 的两个接口二 Bean1 普通 Bean 与 FactoryBean2 Bean 单例与否的设置3 Bean 的生命周期三 IOC 的 Bean 管理(XML)1 创建对象2 属性注入 - 使用 set 方法3 属性注入 - 通过有参构造器实现3 注…

ios realm 文件_iOS开发中使用Realm数据库

// 查RLMResults * dogs [LSDog allObjects];NSLog("%", dogs);RLMResults * pers [LSPerson allObjects]; // 查询所有的数据NSLog("所有的数据:%", pers);RLMResults * perArr [LSPerson objectsWhere:"name 1"]; // 查询某一…

吐槽一下Abp的用户和租户管理模块

1. 背景ASP.NET Core 基于声明的访问控制到底是什么鬼?聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息。-----------ClaimB站:438962688 Name:饭思思_weibo:538210234 Name:饭思思van姓名:不详 籍贯…

后端学习 - JDBC

文章目录一 JDBC概述1 Java中的数据存储技术2 什么是JDBC3 JDBC程序的编写步骤二 Java连接数据库的方式三 使用 PreparedStatement 实现 CRUD 操作1 数据库的调用的三个接口2 增Create/删Delete/改Update 操作3 查Retrieval操作4 批量插入操作四 数据库事务1 事务2 事务的 ACID…

.NET架构小技巧(3)——反射,架构人员法宝I

如题,这是我的心声,反射在我的开发中用的频次还是比较高的,有一本万利的感觉,一段复杂的代码,可以节省大量的时间;但带来的一个问题性能相对较差,所以要选择适合的场景使用。关于C#中的反射基本…

米家扫地机器人充满电需要多长时间_米家扫地机器人充满电后能工作多久?

硬件及结构相关1、Q:米家扫地机器人的激光对小孩或宠物有伤害吗?A:米家扫地机器人通过了IEC 60825-1:2014激光安全等级Class 1的认证,不会对儿童或者宠物带来伤害请放心使用。2硬件及结构相关1、Q:米家扫地机器人的激光…

后端学习 - JavaWeb

技术体系 文章目录一 HTML1 网页的组成部分2 HTML 概述3 HTML 标签4 常用标签5 表单与表单的提交二 CSS1 语法格式2 使用方法三 JavaScript1 概述2 与 HTML 结合的两种方式3 变量类型及特殊值4 关系、逻辑运算5 数组6 函数7 事件8 DOM (Document Object Model&#…

python中的while语句怎么居中_python基础之while语句操作

# i 0# while (i < 9):# print("i ----> ",i)# i i 1# print(i,"i即将大于或者等于9,while不在执行")#执行1-100的数字# a1 1# while a1 < 100:# print(a1,end" ")# a1 a1 1#执行100 -1 的数字# a1 100# while a1 > 0:# prin…

心想技术驱动业务,却在背道而驰

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「165」篇原创敬上大家好&#xff0c;我是Z哥。相信每一位真正的程序员心里都有这样一个念想&#xff1a;只要我的技术够牛&#xff0c;就能驱动业务的发展。但是往…

后端学习 - SpringMVC

文章目录一 SpringMVC 简介1 MVC2 SpringMVC3 创建第一个 SpringMVC 项目二 RequestMapping1 注解类与方法的区别2 value 属性3 method 属性4 params 属性5 headers 属性6 SpringMVC 支持路径中的占位符三 获取 Request 的一系列参数1 通过控制器方法的形参2 控制器方法形参 映…

hbase shell远程连接_hbase与phoenix集成

Phoenix是构建在HBase之上的关系型数据库层&#xff0c;作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问Phoenix会将用户编写的sql查询编译为一系列的scan操作&#xff0c;最终产生通用的JDBC结果集返回给客户端Phoenix可以看成是mysql准备安装包apache-phoenix-4.…

对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相

一&#xff1a;背景1. 讲故事昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为&#xff1a;[C#.NET 拾遗补漏]10&#xff1a;理解 volatile 关键字 (https://www.cnblogs.com/willick/p/13889006.html) 的文章&#xff0c;大概就是说在 多线程环境下&#xff0c;一个在debu…

后端学习 - SpringBoot

SpringBoot 是整合 Spring 技术栈的一站式框架&#xff0c;是简化 Spring 技术栈的快速开发脚手架约定大于配置 文章目录一 概述1 第一个 SpringBoot 项目2 SpringBoot 特性&#xff1a;依赖管理3 SpringBoot 特性&#xff1a;自动配置二 SpringBoot 的 IOC容器1 组件添加&…

centos rpm 安装 perl_Linux【常用软件安装篇】

摘要&#xff1a;本文介绍Linux常用的软件安装方式以及jdk、vim、mysql、tomcat、redis的安装过程。1 Linux常用软件安装方式常用方式有&#xff1a;rmp包安装、yum指令安装、源码包安装、解压免安装。1.1 rpm包安装rpm是Red-Hat Package Manager&#xff08;RPM软件包管理器&a…

日计不足涓滴成河-自定义响应结果格式化器

什么是响应结果响应结果就是&#xff0c;在客户端向服务器发出请求后&#xff0c;服务器根据客户端的请求参数&#xff0c;给出的结果&#xff0c;这就是一个完整的响应结果过程。响应的结果包含的内容非常多&#xff0c;主要的有 HTTP Status Code&#xff0c;Content-Type,Co…

docker 容器启动顺序_Docker容器启动时初始化Mysql数据库

1. 前言 Docker在开发中使用的越来越多了&#xff0c;最近搞了一个Spring Boot应用&#xff0c;为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢&#xff1f; 我这里有两个传统方案。 第一种方案是在容器启动后手动导入&#xff0c;太low了不行。第二…

后端学习 - JVM(上)内存与垃圾回收

JVM 架构图 文章目录一 JVM 简介二 类加载子系统&#xff1a;1 作用2 类的三个加载过程3 类加载器的分类4 双亲委派机制 & Tomcat为何不遵循5 两个 class 对象为同一个类的必要条件三 运行时数据区&#xff1a;PC寄存器&#xff08;Program Counter Register&#xff09;四…

SM2 国密算法被 Linux 内核社区接受

喜欢就关注我们吧&#xff01;10 月 25 日&#xff0c;有开发者发文称&#xff0c;SM2 国密算法终于被 Linux 内核社区接受了。该作者表示&#xff0c;SM2 的补丁已经更新到了 v7 版本&#xff0c;这个版本的补丁最终被社区接受&#xff0c;目前已经合并到了 Linux 主线的 5.10…

后端学习 - MyBatis

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的 持久层框架 文章目录一 基于配置文件的 MyBatis 搭建1 搭建过程&#xff08;增删改&#xff09;2 查询操作3 特殊操作二 MyBatis 获取参数值的方式1 单个字面量类型的参数2 多个字面量类型的参数3 Map 类型的参数4 实体…

向下兼容性格什么意思_担心对方只是向下兼容,并不是从心底里接纳我怎么办?...

无需刻意累计帮助了44人题主你好&#xff0c;不知道什么时候“向下兼容”这个词被用在了人际关系上&#xff0c;只就我个人所了解的话&#xff0c;这是一个很不严谨的用法。因为在自我接纳中用了“向下”本身就意味着不平等和不接纳。形容一个人“向下兼容”本身就自带了否认倾…