给 ABP vNext 应用安装私信模块

在上一节五分钟完成 ABP vNext 通讯录 App 开发 中,我们用完成了通讯录 App 的基础开发。

这本章节,我们会给通讯录 App 安装私信模块,使不同用户能够通过相互发送消息,并接收新私信的通知。在章节的最后,笔者将演示模块的“改装”,实现禁止用户发私信给自己的定制化需求。

什么是“模块”?

使用 Abp 框架,你可以提前制作一些功能模块,例如微信登录、私信、博客、论坛等模块,将它们打包备用。在开发具体的 App 应用时,你可以轻松将模块安装到你的工程中,节省了大量的重复性工作。除了自己造轮子,你还可以在 NuGet 上安装由开源社区维护的模块,当然,社区也在等待你的贡献。

安装私信模块

笔者用到的私信应用模块(EasyAbp.PrivateMessaging)由 EasyAbp 组织开发并持续维护,你甚至可以在商业项目中免费使用它。现在,笔者将带你一步步给通讯录 App 安装此模块。

第一步:使用 NuGet 安装模块包

  1. 将 NuGet 包 EasyAbp.PrivateMessaging.Application,安装到 AddressBook.Application 项目。

  2. 将 NuGet 包 EasyAbp.PrivateMessaging.Application.Contracts,安装到 AddressBook.Application.Contracts 项目。

  3. 将 NuGet 包 EasyAbp.PrivateMessaging.Domain,安装到 AddressBook.Domain项目。

  4. 将 NuGet 包 EasyAbp.PrivateMessaging.Domain.Shared,安装到 AddressBook.Domain.Shared 项目。

  5. 将 NuGet 包 EasyAbp.PrivateMessaging.EntityFrameworkCore,安装到 AddressBook.EntityFrameworkCore 项目。

  6. 将 NuGet 包 EasyAbp.PrivateMessaging.HttpApi,安装到 AddressBook.HttpApi 项目。

  7. 将 NuGet 包 EasyAbp.PrivateMessaging.HttpApi.Client,安装到 AddressBook.HttpApi.Client 项目。

  8. 将 NuGet 包 EasyAbp.PrivateMessaging.MongoDB,安装到 AddressBook.MongoDB 项目。

  9. 将 NuGet 包 EasyAbp.PrivateMessaging.Web,安装到 AddressBook.Web 项目。(如果你不需要 UI,可以跳过这一步)

第二步:添加配置

  1. 分别在以上项目的 Module 类中添加私信模块的依赖,例如:在 AddressBookApplicationModule.cs 中添加特性 [DependsOn(PrivateMessagingApplicationModule)],以此类推。

  2. 在 AddressBookApplicationModule.cs 中找到 Configure<AbpAspNetCoreMvcOptions>(options => { ... });,在里面加一行配置 options.ConventionalControllers.Create(typeof(PrivateMessagingApplicationModule).Assembly);,这一步是为了私信模块 WebAPI 的自动生成。

  3. 在 AddressBookMigrationsDbContext.cs 中找到 OnModelCreating 方法,在里面加一行 builder.ConfigurePrivateMessaging();,使私信模块的 EF Core 迁移能够进行。

第三步:创建 EF Core 迁移并更新数据库

不熟悉这块操作的同学可以参考 Abp 官方手册的介绍。

第四步:安装完毕

启动 AddressBook.Web 项目,可以看到私信模块已经安装成功了。

进一步了解 EasyAbp 私信模块:https://github.com/EasyAbp/PrivateMessaging

改进模块:禁止用户发私信给自己

Abp vNext 框架支持应用对模块代码的重写,在 AddressBook.Application 项目中新建 MyPrivateMessageAppService.cs

    [Dependency(ReplaceServices = true)]public class MyPrivateMessageAppService : PrivateMessageAppService{public MyPrivateMessageAppService(IDataFilter dataFilter,IExternalUserLookupServiceProvider externalUserLookupServiceProvider,IPrivateMessageRepository privateMessageRepository,IPrivateMessageNotificationManager notificationManager,IPrivateMessageSenderSideManager privateMessageSenderSideManager,IPrivateMessageReceiverSideManager privateMessageReceiverSideManager) : base(dataFilter,externalUserLookupServiceProvider, privateMessageRepository, notificationManager,privateMessageSenderSideManager, privateMessageReceiverSideManager){}public override Task<PrivateMessageDto> CreateAsync(CreateUpdatePrivateMessageDto input){if (input.ToUserName == CurrentUser.UserName){throw new UserFriendlyException("请勿给自己发消息");}return base.CreateAsync(input);}}

效果展示

基于 Abp 的高可扩展性,甚至 JS 和 CSS 等静态文件也能够被重写,请阅读官方文档以了解更多用法:Customizing the Existing Modules

后记

等到不久的将来 Abp 官方模块商城 market.abp.io 上线,文中手动安装模块的方式将成为历史,你只需要按一个键,模块就自动安装好了。在此之前,AbpHelper 可能会先开发一个简易的模块安装器,如果你有需要,请关注我们的进展:https://github.com/EasyAbp/EasyAbpGuide

下一节

在下一节中,笔者将会介绍,如何通过一个改动,让我们的通讯录 App 升级为多租户 SaaS 系统。

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

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

相关文章

《C++ Primer》7.5.2节练习

练习7.41: #include <iostream> #include <string> using namespace std;class Sales_data {friend std::istream &read(std::istream &is, Sales_data &item);friend std::ostream &print(std::ostream &os, const Sales_data &item);pu…

零基础玩视频号?创作运营变现,你要的干货都在这了!

点击蓝字“大白技术控”关注我哟加个“星标★”&#xff0c;每日良时&#xff0c;好文必达&#xff01;不少小伙伴应该已经听说过视频号这个新功能了&#xff0c;视频号是微信内测的短视频功能&#xff0c;本人已经在视频号里刷了2个月了。3月中旬正式开通了视频号 「大白技术控…

Asp.Net Core 中IdentityServer4 实战之 Claim详解

一、前言由于疫情原因&#xff0c;让我开始了以博客的方式来学习和分享技术&#xff08;持续分享的过程也是自己学习成长的过程&#xff09;&#xff0c;同时也让更多的初学者学习到相关知识&#xff0c;如果我的文章中有分析不到位的地方&#xff0c;还请大家多多指教&#xf…

程序员还有35岁的坎吗?

昨天晚上和多年未见的前同事聊天&#xff0c;提到了程序员的年龄歧视问题&#xff1a;自己年龄也 30 出头了&#xff0c;在思考 IT 届流传的 35 岁是一个坎的问题&#xff1b;开始注重提升管理能力&#xff0c;担心35岁之后&#xff0c;一线写代码的岗位不能胜任&#xff1b;公…

java 左移 返回值_java左移右移运算符详解

在阅读源码的过程中&#xff0c;经常会看到这些符号<< &#xff0c;>>&#xff0c;>>>&#xff0c;这些符号在Java中叫移位运算符&#xff0c;在写代码的过程中&#xff0c;虽然我们基本上不会去写这些符号&#xff0c;但需要明白这些符号的运算原理&…

人与人的差距在于认知

作者介绍findyi&#xff0c;腾讯、360码农&#xff0c;前哒哒少儿英语技术VP&#xff0c;现任土豆教育CTO。工作和生活中不光要埋头干活&#xff0c;还要抬头看天。思考总结方法论是提升认知的必备途径&#xff0c;是将碎片化知识总结为动态的智慧的过程。认知有多重要&#xf…

.NET5来了你别慌

近日微软.Net大咖Scott在博客中对外宣传.NET5首个预览版&#xff0c;并且我们可以通过微软的官网下载SDK5和运行库。很多朋友感觉.NetCore3.1还没搞明白&#xff0c;.NET5就来了感觉一下子慌了神。在这里我提醒朋友们&#xff0c;瞬息万变的世界中&#xff0c;总有相对不变的真…

java8 stream 最大值_JDK8-Stream流常用方法

Stream流的使用流操作是Java8提供一个重要新特性&#xff0c;它允许开发人员以声明性方式处理集合&#xff0c;其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中&#xff0c;能 让代码更加简…

周三晚6点半!盛派首席架构师“苏老师”在线解密内部系统框架!

工作中有些事&#xff0c;看起来只用一会会儿就能完成&#xff0c;但真正完成起来&#xff0c;总会遇到一些意想不到的困难&#xff01;你一定碰到过这样的情况——开发时间 2 周的项目&#xff0c;搭框架就要用 1 周&#xff0c;刚开发完&#xff0c;各种调试和修 bug又花去 2…

给微软的日志框架写一个基于委托的日志提供者

动手造轮子&#xff1a;给微软的日志框架写一个基于委托的日志提供者Intro微软的日志框架现在已经比较通用&#xff0c;有时候我们不想使用外部的日志提供者&#xff0c;但又希望提供一个比较简单的委托就可以实现日志记录&#xff0c;于是就有了后面的探索和实现。Solution基于…

C++分析使用拷贝控制成员和调用构造函数的时机

我们来分析下面这段代码&#xff1a; #include <iostream> #include <vector>using namespace std;struct X {X() {cout << "构造函数X()" << endl;}X(const X &) {cout << "拷贝构造函数X(const X&)" << en…

《C++ Primer》13.1.4节练习

练习13.14: 这是一个典型的应该定义拷贝控制成员的场合。如果不定义拷贝构造函数和拷贝赋值运算符&#xff0c;依赖合成的版本&#xff0c;则在拷贝构造和赋值时&#xff0c;会简单复制数据成员。对本问题来说&#xff0c;就是将序号简单复制给新对象。 因此&#xff0c;代码中…

十问十答 CDDL 许可证

今天我们来整理一下通用开发和发行许可证 CDDL 的十大问题清单。通用开发与发行许可证&#xff08;Common Development and Distribution License&#xff0c;CDDL&#xff09;由已被甲骨文公司收购的太阳微系统公司&#xff08;Sun Microsystems&#xff09;发布的一种开源许可…

Http Server API路由请求到web程序

引言接上文&#xff0c;容器内web程序一般会绑定到http://0.0.0.0:{某监听端口}或http://:{某监听端口}&#xff0c;以确保使用容器IP可以访问到web应用。正如我们在ASP.NET Core官方镜像显示的&#xff0c;ASP.NET Core程序在容器内80端口监听请求This image sets the ASPNETC…

《C++ Primer》13.1.6节练习(部分)

练习13.18: #include <iostream> #include <string> using namespace std;class Employee {private:static int sn;public:Employee() {mysn sn;}Employee(const string &s) {name s;mysn sn;}const string &get_name() {return name;}int get_mysn() …

用Azure Custom Vision 零代码创建一个口罩识别模型

新冠肺炎下&#xff0c;地球是一家&#xff0c;不分国籍&#xff0c;不分种族&#xff0c;或者现在只能呆在家中&#xff0c;但是也是一种对抗疫的支持。停课不停学留在家中&#xff0c;不仅是对学生&#xff0c;对于所有人都是有用的。在现阶段&#xff0c;大家可能最需要的不…

C++拷贝构造函数调用时机分析

让我们来分析下面这段代码&#xff1a; #include <iostream> #include <string> using namespace std;class Employee {private:static int sn;public:Employee() {cout << "Employee()" << endl;mysn sn;}Employee(const string &s) …

百万年薪程序员的7点能力

作者介绍findyi&#xff0c;腾讯、360码农&#xff0c;前哒哒少儿英语技术VP&#xff0c;现任土豆教育CTO。几周前&#xff0c;微盟爆了个大雷&#xff0c;数据库让内部员工删库跑路。写了篇文章&#xff0c;做了一些我的判断&#xff1a;从微盟36小时故障&#xff0c;谈谈数据…

《C++ Primer》13.1.1节练习

练习13.1: 如果构造函数的第一个参数是自身类类型的引用&#xff0c;且所有其他参数&#xff08;如果有的话&#xff09;都有默认值&#xff0c;则此构造函数是拷贝构造函数。拷贝构造函数在以下几种情况下会被使用&#xff1a; ●拷贝初始化&#xff08;用定义变量&#xff09…

Java将五个整数存入整形数组_异常处理:从命令行输入5个整数,放入一整型数组,然后打印输出。。。...

从命令行输入5个整数&#xff0c;放入一整型数组&#xff0c;然后打印输出。要求&#xff1a;如果输入数据不为整数&#xff0c;要捕获输入不匹配异常&#xff0c;显示“请输入整数”&#xff1b;如果输入数据多余5个&#xff0c;捕获数组越界异常&#xff0c;显示“请输入5个整…