ABP入门系列(15)——创建微信公众号模块
2017-04-01 09:39
627 查看
ABP入门系列目录——学习Abp框架之实操演练
源码路径:Github-LearningMpaAbp
的确,智能手机作为我们日常生活已必不可少的一部分,通过手机app能够获得更好的体验,比如社交、购物、娱乐、生活。
但这也引入了一个问题,如果布局移动市场,就意味着要维护好几条产品线,比如网页、Android、IOS、微信公众号等。这对公司来说无疑是一项大的投入。
产品对于用户来说,用户只关心体验。
而对于开发者来说,开发者更关心在保证业务流程及数据的正确流转下,如何对产品线进行集成,来避免做重复工作。
而恰好ABP框架就已经帮我们解决了这一问题,Abp是基于【模块化设计思想】构建的,开发人员可以将自定义的功能以模块(module)的形式集成到ABP中。
不同的模块通过组装就可以组成一个新的功能。
那你肯定很好奇如何玩转Abp模块,下面我们就以我们的Demo为例,来进行微信公众号模块的开发。
从代码中可以看出主要包括四个重载方法,每个重载方法负责不同的职责。
那怎样指定依赖呢,只需要通过[DependsOn]特性指定即可。
好了,一个微信公众号模块的基础项目框架搭好了,是不是很简单!
到这一步,你可能会问,你这只是简单创建微信公众号模块,但如何与我们Demo进行集成交互呢?
对的,是只简单创建了微信模块,但这一节我不打算讲如何与Demo进行集成交互。因为在介绍如何通过webapi与系统交互之前,梳理下Abp模块化的设计,更能帮助我们了解模块化设计思想。
下面我们就简单梳理下ABP模块化的设计。
不知道的就自行查词典吧。
下面回归正题。
从类型依赖图中可以看出设计的并不复杂:
AbpModule:所有定义的模块均需继承此抽象类。
AbpModuleInfo:可以理解为AbpModule的元数据,封装AbpModule的基本信息,主要包括Assembly(所属程序集)、Type(类型)、Dependencies(依赖的模块)、IsLoadedAsPlugIn(是否插件模块)。
AbpModuleCollection:从类的申明:
AbpModuleManager:模块管理类,主要用来进行模块管理,比如启动关闭模块。
DependsOnAttribute:依赖特性,用来标明模块的依赖项。
而作为Abp生成的模板项目,启动项目自然是web应用,所以
我们先来观察下类的申明,有没有发现什么特别之处?
继承的是泛型基类且指定的泛型为
对MVC比较熟悉的同学应该知道,MVC应用程序启动类默认是继承自
首先映入眼帘的是基类中定义的
代码是不是看累了,上图,咱们直接来看web项目启动时Module动态加载的调用堆栈。
是不是一目了然,总结以下:
Abp在启动项目时根据指定的启动模块(StartupModule)首先加载该模块,然后再去检查该模块的自定义特性是否定义有[DependsOn]特性,若有则按序加载所有依赖的模块,也就是链式动态依赖加载。然后再依次调用Module的PreInitialize,Initialize和PostInitialize以完成初始化。
好了模块的启动加载就讲到这里,感兴趣的还是建议大家直接看看源码。
这里推荐一篇文章ABP源码分析三:ABP Module,来帮助大家理解Abp的模块化思想。
源码路径:Github-LearningMpaAbp
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包,点击确定安装即可。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包。那怎样指定依赖呢,只需要通过[DependsOn]特性指定即可。
[DependsOn(typeof(AbpWebApiModule))] public class LearningMpaAbpWeixinModule:AbpModule { //.... }
好了,一个微信公众号模块的基础项目框架搭好了,是不是很简单!
到这一步,你可能会问,你这只是简单创建微信公众号模块,但如何与我们Demo进行集成交互呢?
对的,是只简单创建了微信模块,但这一节我不打算讲如何与Demo进行集成交互。因为在介绍如何通过webapi与系统交互之前,梳理下Abp模块化的设计,更能帮助我们了解模块化设计思想。
下面我们就简单梳理下ABP模块化的设计。
3. ABP模块化设计
说到模块,突然想到几个单词考考大家,model、modal、module分别是什么意思?不知道的就自行查词典吧。
下面回归正题。
3.1. 模块化相关类型
先来看看模块相关类型依赖图:从类型依赖图中可以看出设计的并不复杂:
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_Start和
Application_End虚方法。
Application_Start方法中调用了
AbpBootstrapper.Initialize()方法。相当于
AbpBootstrapper.Create<TStartupModule>().Initialize();
代码是不是看累了,上图,咱们直接来看web项目启动时Module动态加载的调用堆栈。
是不是一目了然,总结以下:
Abp在启动项目时根据指定的启动模块(StartupModule)首先加载该模块,然后再去检查该模块的自定义特性是否定义有[DependsOn]特性,若有则按序加载所有依赖的模块,也就是链式动态依赖加载。然后再依次调用Module的PreInitialize,Initialize和PostInitialize以完成初始化。
好了模块的启动加载就讲到这里,感兴趣的还是建议大家直接看看源码。
这里推荐一篇文章ABP源码分析三:ABP Module,来帮助大家理解Abp的模块化思想。
4. 总结
这一节有点标题党的味道,但内容也算点题了。下一篇我将介绍微信公众号模块如何通过WebApi与系统进行交互,尽情期待。相关文章推荐
- ABP入门系列(1)——通过模板创建MAP版本项目
- ABP入门系列(2)——领域层创建实体
- ABP学习入门系列(四)(创建Service)
- ABP入门系列(1)——通过模板创建MAP版本项目
- ABP入门系列(4)——创建应用服务
- Intellij IDEA 2016学习系列之(一)创建maven 多模块项目 .
- ABP学习入门系列(三) (领域层中的仓储Repository)
- Angular 4入门教程系列:15:NG-ZORRO的使用方式
- ABP入门系列(13)——Redis缓存用起来
- Intellij IDEA 2016学习系列之(一)创建maven 多模块项目
- [06] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型
- Windows Azure入门教学系列 (三):创建第一个Worker Role程序
- Windows Azure AppFabric 入门教学系列 (一):创建 AppFabric 项目与命名空间
- Provisioning Services 7.6 入门到精通系列之七:创建虚拟磁盘
- [unreal4入门系列之九] UE4创建空白关卡并添加碰撞体
- python入门系列7―——模块
- [.NET MVC4 入门系列07] 在Model模型模块中添加验证
- Hadoop系列修炼---入门笔记15
- Windows Azure入门教学系列 (三):创建第一个Worker Role程序
- ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程