ABP入门系列(15)——创建微信公众号模块

1. 引言

现在的互联网已不在仅仅局限于网页应用,IOS、Android、平板、智能家居等平台正如火如荼的迅速发展,移动应用的需求也空前旺盛。所有的互联网公司都不想错过这一次移动浪潮,布局移动市场分一份移动红利。
的确,智能手机作为我们日常生活已必不可少的一部分,通过手机app能够获得更好的体验,比如社交、购物、娱乐、生活。

但这也引入了一个问题,如果布局移动市场,就意味着要维护好几条产品线,比如网页、Android、IOS、微信公众号等。这对公司来说无疑是一项大的投入。
产品对于用户来说,用户只关心体验。
而对于开发者来说,开发者更关心在保证业务流程及数据的正确流转下,如何对产品线进行集成,来避免做重复工作。

而恰好ABP框架就已经帮我们解决了这一问题,Abp是基于【模块化设计思想】构建的,开发人员可以将自定义的功能以模块(module)的形式集成到ABP中。
不同的模块通过组装就可以组成一个新的功能。

那你肯定很好奇如何玩转Abp模块,下面我们就以我们的Demo为例,来进行微信公众号模块的开发。

2. 创建微信公众号模块

定义一个模块很简单,只需创建微信项目,然后定义WeixinModule类继承自AbpModule即可,再然后为WeixinModule定义[DependsOn]特性指定依赖的模块即可。

2.1. 创建微信公众号项目

新建mvc项目,命名项目名为LearningMpaAbp.Weixin。因为要使用到Abp定义的模块功能,首先要安装Abp Nuget包,选择后会提示需要以下Nuget包,点击确定安装即可。

安装Abp需要依赖安装的Nuget包

2.2. 定义微信公众模块

新建LearningMpaAbpWeixinModule继承自AbpModule。代码如下:

 

public class LearningMpaAbpWeixinModule:AbpModule
{/// <summary>/// 预初始化,通常是用来配置框架以及其它模块/// </summary>public override void PreInitialize(){base.PreInitialize();}/// <summary>/// 初始化,一般用来依赖注入的注册/// </summary>public override void Initialize(){//把当前程序集的特定类或接口注册到依赖注入容器中IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}/// <summary>/// 提交初始化,一般用来解析依赖关系/// </summary>public override void PostInitialize(){base.PostInitialize();}/// <summary>/// 应用关闭时调用/// </summary>public override void Shutdown(){base.Shutdown();}
}

从代码中可以看出主要包括四个重载方法,每个重载方法负责不同的职责。

2.3. 指定依赖模块

因为我们需要通过webapi与现有demo进行交互,所以还需要安装Abp.Web.Api Nuget包。

安装Abp.Web.Api需要依赖安装的Nuget包

那怎样指定依赖呢,只需要通过[DependsOn]特性指定即可。

 

[DependsOn(typeof(AbpWebApiModule))]
public class LearningMpaAbpWeixinModule:AbpModule
{//....
}

好了,一个微信公众号模块的基础项目框架搭好了,是不是很简单!

到这一步,你可能会问,你这只是简单创建微信公众号模块,但如何与我们Demo进行集成交互呢?

对的,是只简单创建了微信模块,但这一节我不打算讲如何与Demo进行集成交互。因为在介绍如何通过webapi与系统交互之前,梳理下Abp模块化的设计,更能帮助我们了解模块化设计思想。

下面我们就简单梳理下ABP模块化的设计。

3. ABP模块化设计

说到模块,突然想到几个单词考考大家,model、modal、module分别是什么意思?
不知道的就自行查词典吧。

下面回归正题。

3.1. 模块化相关类型

先来看看模块相关类型依赖图:

Module相关类型依赖图

从类型依赖图中可以看出设计的并不复杂:

  • AbpModule:所有定义的模块均需继承此抽象类。
  • AbpModuleInfo:可以理解为AbpModule的元数据,封装AbpModule的基本信息,主要包括Assembly(所属程序集)、Type(类型)、Dependencies(依赖的模块)、IsLoadedAsPlugIn(是否插件模块)。
  • AbpModuleCollection:从类的申明:class AbpModuleCollection : List可知它是一个AbpModuleInfo的集合。
  • AbpModuleManager:模块管理类,主要用来进行模块管理,比如启动关闭模块。
  • DependsOnAttribute:依赖特性,用来标明模块的依赖项。

3.2. Abp如何发现并加载模块

Abp中定义了一个启动类AbpBootstraper,该类的职责是启动整个Abp系统,主要负责依赖注入和注册模块以供启动。而该类必须在应用程序启动时最先被实例化。
而作为Abp生成的模板项目,启动项目自然是web应用,所以AbpBootstrapper肯定在Web项目中被初始化。众所周知,web项目的启动是从Global.asax文件的Application_Start项目开始的。

 

public class MvcApplication : AbpWebApplication<LearningMpaAbpWebModule>
{protected override void Application_Start(object sender, EventArgs e){AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseAbpLog4Net().WithConfig("log4net.config"));base.Application_Start(sender, e);}
}

我们先来观察下类的申明,有没有发现什么特别之处?
继承的是泛型基类且指定的泛型为LearningMpaAbpWebModule,指定了一个Module,当前web项目的Moduel。
对MVC比较熟悉的同学应该知道,MVC应用程序启动类默认是继承自HttpApplication的。从该段代码可以看出,Abp修改了MvcApplication的默认继承类。那自然AbpWebApplication<T>是继承自HttpApplication了。废话不多说,来看一看具体的定义:

 

public abstract class AbpWebApplication<TStartupModule> 
: HttpApplication where TStartupModule : AbpModule
{/// <summary>/// Gets a reference to the <see cref="P:Abp.Web.AbpWebApplication`1.AbpBootstrapper" /> instance./// </summary>public static AbpBootstrapper AbpBootstrapper { get; } = AbpBootstrapper.Create<TStartupModule>();/// <summary>/// This method is called by ASP.NET system on web application's startup./// </summary>protected virtual void Application_Start(object sender, EventArgs e){ThreadCultureSanitizer.Sanitize();AbpWebApplication<TStartupModule>.AbpBootstrapper.Initialize();}/// <summary>/// This method is called by ASP.NET system on web application shutdown./// </summary>protected virtual void Application_End(object sender, EventArgs e){AbpWebApplication<TStartupModule>.AbpBootstrapper.Dispose();}
//省略了部分代码
}

首先映入眼帘的是基类中定义的AbpBootstraper属性,然后看到的是Application_StartApplication_End虚方法。
Application_Start方法中调用了AbpBootstrapper.Initialize()方法。相当于AbpBootstrapper.Create<TStartupModule>().Initialize();

代码是不是看累了,上图,咱们直接来看web项目启动时Module动态加载的调用堆栈。

Module动态加载的调用堆栈

是不是一目了然,总结以下:

Abp在启动项目时根据指定的启动模块(StartupModule)首先加载该模块,然后再去检查该模块的自定义特性是否定义有[DependsOn]特性,若有则按序加载所有依赖的模块,也就是链式动态依赖加载。然后再依次调用Module的PreInitialize,Initialize和PostInitialize以完成初始化。

好了模块的启动加载就讲到这里,感兴趣的还是建议大家直接看看源码。
这里推荐一篇文章ABP源码分析三:ABP Module,来帮助大家理解Abp的模块化思想。

4. 总结

这一节有点标题党的味道,但内容也算点题了。下一篇我将介绍微信公众号模块如何通过WebApi与系统进行交互,尽情期待。



作者:圣杰
链接:https://www.jianshu.com/p/1e6efd9be629
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

spark 算子例子_Spark性能调优方法

公众号后台回复关键词&#xff1a;pyspark&#xff0c;获取本项目github地址。Spark程序可以快如闪电⚡️&#xff0c;也可以慢如蜗牛?。它的性能取决于用户使用它的方式。一般来说&#xff0c;如果有可能&#xff0c;用户应当尽可能多地使用SparkSQL以取得更好的性能。主要原…

ABP入门系列(16)——通过webapi与系统进行交互

1. 引言 上一节我们讲解了如何创建微信公众号模块&#xff0c;这一节我们就继续跟进&#xff0c;来讲一讲公众号模块如何与系统进行交互。 微信公众号模块作为一个独立的web模块部署&#xff0c;要想与现有的【任务清单】进行交互&#xff0c;我们要想明白以下几个问题&#x…

python嵩天第二版第五章_如何避免从入门到放弃——python小组学习复盘

2019年春节python学习行动复盘2019-02-09为了主攻python&#xff0c;没有参加心理学晨读。对心理学也不敢兴趣&#xff0c;怕耽误学习python的时间。那么没学习心理学的情况下&#xff0c;python学的怎么样&#xff1f;是否达到自己的预期&#xff1f;一、预期目标&#xff1a;…

ABP入门系列(17)——使用ABP集成的邮件系统发送邮件

1.Abp集成的邮件模块是如何实现的 ABP中对邮件的封装主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空间下&#xff0c;相应源码在此。 分析可以看出主要由以下几个核心类组成&#xff1a; EmailSettingNames&#xff1a;静态常量类&#xff0c;主要定义了发送邮件需要的相关…

cdn转发防攻击_高防CDN和高防服务器的区别?

越来越多的网络攻击需要处理&#xff0c;而高防CDN和高防服务器是很好的选择&#xff0c;那么如何选择呢&#xff1f;我们就来分析一下关于这两者之间的选择。首先从价格上看的话&#xff0c;高防御CDN的价格相对高一些&#xff0c;防御上看&#xff0c;高防御CDN的防御效果也更…

ABP入门系列(18)—— 使用领域服务

1.引言 自上次更新有一个多月了&#xff0c;发现越往下写&#xff0c;越不知如何去写。特别是当遇到DDD中一些概念术语的时候&#xff0c;尤其迷惑。如果只是简单的去介绍如何去使用ABP&#xff0c;我只需参照官方文档&#xff0c;实现到任务清单Demo中去就可以了&#xff0c;…

mysql文件类型_MyCat教程:实现MySql主从复制

原文&#xff1a;http://iii75.cn/mwQhBW 作者&#xff1a;波波烤鸭历史相关文章Mycat入门教程单个mysql数据库在处理业务的时候肯定是有限的&#xff0c;这时我们扩展数据库的第一种方式就是对数据库做读写分离(主从复制),本文我们就先来介绍下怎么来实现mysql的主从复制操作。…

截屏当前界面_电脑屏幕怎么截取,常见的几种电脑截屏方法

随着科技的快速发展电脑已经逐渐渗入到我们的工作和生活中&#xff0c;我们需要使用电脑的地方也越来越多&#xff0c;电脑已经成为了一种新式的办公工具。今天小编不是向大家介绍电脑的应用&#xff0c;而是想要和大家分享一下关于电脑截图的几种方法。1、Print Screen SysRqP…

ABP入门系列(19)——使用领域事件

1.引言 最近刚学习了下DDD中领域事件的理论知识&#xff0c;总的来说领域事件主要有两个作用&#xff0c;一是解耦&#xff0c;二是使用领域事件进行事务的拆分&#xff0c;通过引入事件存储&#xff0c;来实现数据的最终一致性。若想了解DDD中领域事件的概念&#xff0c;可参…

扩容是元素还是数组_Java中对数组的操作

数组对于每一门编程语言来说都是重要的数据结构之一&#xff0c;当然不同语言对于数组的实现及处理也不尽相同。Java语言中提供的数组是用来存储固定大小的同类型元素。如&#xff1a;声明一个数组变量&#xff0c;numbers[100]来代替直接声明100个独立变量number0,number1,...…

ABP入门系列(20)——使用后台作业和工作者

1.引言 说到后台作业&#xff0c;你可能条件反射的想到BackgroundWorker&#xff0c;但后台作业并非是后台任务&#xff0c;后台作业用一种队列且持久稳固的方式安排一些待执行后台任务。 为执行长时间运行的任务而用户无需等待&#xff0c;以提高用户体验。为创建可重试且持…

加载中_GIS地图在项目中的加载显示

下面我们就来说说如何在应用程序中加载显示GIS地图&#xff0c;首先我们在SuperMap iDesktop 9D(10i)中编辑好我们需要的地图&#xff0c;如下图所示&#xff1a;如上图所示&#xff0c;这是我编辑好的一幅天河区的地图&#xff0c;下面我就以这幅地图为例来说说如何把这样一幅…

ABP入门系列(21)——切换MySQL数据库

1. 引言 Abp支持MySql已经不是什么新鲜事了&#xff0c;但按照官方文档&#xff1a;Entity Framework - MySql Integration来&#xff0c;你未必能成功切换&#xff0c;本文就记录下切换MySql数据库遇到的一些坑&#xff0c;供后人乘凉&#xff01; 2. 环境准备 MySql数据库…

ABP开发框架前后端开发系列---(1)框架的总体介绍

ABP是ASP.NET Boilerplate的简称&#xff0c;ABP是一个开源且文档友好的应用程序框架。ABP不仅仅是一个框架&#xff0c;它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型。学习使用ABP框架也有一段时间了,一直想全面了解下这个框架的整个来龙去脉&#xff0c;并把…

c++ pdflib输出表格_DescrTab2包,输出SCI级别的描述统计表

今天浏览R包&#xff0c;发现一个不错的包——DescrTab2包。看R包介绍&#xff0c;这个包可以绘制出版物质量级别的描述统计表。看起来很不错。下面来学习下。1. R包安装和加载install.packages("DescrTab2") # 安装包library(DescrTab2) # 加载包2. 加载演示数据集l…

服务器怎么控制忽略样式_使用JavaScript来编写你的CSS样式代码——JSS

介绍JSS是CSS的创作工具&#xff0c;它允许你使用JavaScript以声明&#xff0c;无冲突和可重用的方式描述样式。它可以在浏览器&#xff0c;服务器端或在构建时在Node中编译。JSS与框架无关。它由多个包组成&#xff1a;核心部分&#xff0c;插件以及框架集成等。Githubhttps:/…

Java设计模式、框架、架构、平台之间的关系

1、设计模式 为什么要先说设计模式?因为设计模式在这些概念中是最基本的&#xff0c;而且也比较简单。那么什么是设计模式呢?说的直白点&#xff0c;设计模式就是告诉你针对特定问题如何组织类、对象和接口之间的关系&#xff0c;是前人总结的经验。比如我要在代码中实现一个…

如何学习(记住)linux命令(常用选项)

作者&#xff1a;林果皞 链接&#xff1a;https://www.zhihu.com/question/21690166/answer/66721478 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 Unix & Linux 命令行特别之处在于&#xff0c;一些选项的设…

增效工具_【危中寻机】降本增效生存之道 运用IE基础工具提升制造效率

效率提升的利器工业工程IE作为一门学科诞生于美国&#xff0c;却首先在日本得到了最大程度的践行与推广&#xff0c;成为了丰田生产方式TPS及精益制造LP的核心现场IE中的4大核心(工程分析、动作分析、时间分析、布局分析)仍是所有IE的入门工具&#xff0c;被笔者称为“基础IE”…

as将安卓应用打包_Android Studio打包生成apk的方法(超级简单哦)

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;打包文件是需要生成APK文件&#xff0c;其他人可以通过APK安装和使用&#xff0c;一般来说&#xff0c;包是指APK生成的发布版本&#xff0c;下文技术狗小编还介绍了Android Studio 超级简单的打包生成apk的方法&a…