建设有限公司网站,技术支持 骏域网站建设专家佛山,台州网站建设 推广公司,十种人不适合做管理者1. 引言
现在的互联网已不在仅仅局限于网页应用#xff0c;IOS、Android、平板、智能家居等平台正如火如荼的迅速发展#xff0c;移动应用的需求也空前旺盛。所有的互联网公司都不想错过这一次移动浪潮#xff0c;布局移动市场分一份移动红利。 的确#xff0c;智能手机作…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/// 预初始化通常是用来配置框架以及其它模块/// /summarypublic override void PreInitialize(){base.PreInitialize();}/// summary/// 初始化一般用来依赖注入的注册/// /summarypublic override void Initialize(){//把当前程序集的特定类或接口注册到依赖注入容器中IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}/// summary/// 提交初始化一般用来解析依赖关系/// /summarypublic override void PostInitialize(){base.PostInitialize();}/// summary/// 应用关闭时调用/// /summarypublic 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 : AbpWebApplicationLearningMpaAbpWebModule
{protected override void Application_Start(object sender, EventArgs e){AbpBootstrapper.IocManager.IocContainer.AddFacilityLoggingFacility(f f.UseAbpLog4Net().WithConfig(log4net.config));base.Application_Start(sender, e);}
}我们先来观察下类的申明有没有发现什么特别之处 继承的是泛型基类且指定的泛型为LearningMpaAbpWebModule指定了一个Module当前web项目的Moduel。 对MVC比较熟悉的同学应该知道MVC应用程序启动类默认是继承自HttpApplication的。从该段代码可以看出Abp修改了MvcApplication的默认继承类。那自然AbpWebApplicationT是继承自HttpApplication了。废话不多说来看一看具体的定义 public abstract class AbpWebApplicationTStartupModule
: HttpApplication where TStartupModule : AbpModule
{/// summary/// Gets a reference to the see crefP:Abp.Web.AbpWebApplication1.AbpBootstrapper / instance./// /summarypublic static AbpBootstrapper AbpBootstrapper { get; } AbpBootstrapper.CreateTStartupModule();/// summary/// This method is called by ASP.NET system on web applications startup./// /summaryprotected virtual void Application_Start(object sender, EventArgs e){ThreadCultureSanitizer.Sanitize();AbpWebApplicationTStartupModule.AbpBootstrapper.Initialize();}/// summary/// This method is called by ASP.NET system on web application shutdown./// /summaryprotected virtual void Application_End(object sender, EventArgs e){AbpWebApplicationTStartupModule.AbpBootstrapper.Dispose();}
//省略了部分代码
}首先映入眼帘的是基类中定义的AbpBootstraper属性然后看到的是Application_Start和Application_End虚方法。Application_Start方法中调用了AbpBootstrapper.Initialize()方法。相当于AbpBootstrapper.CreateTStartupModule().Initialize();
代码是不是看累了上图咱们直接来看web项目启动时Module动态加载的调用堆栈。 Module动态加载的调用堆栈
是不是一目了然总结以下 Abp在启动项目时根据指定的启动模块StartupModule首先加载该模块然后再去检查该模块的自定义特性是否定义有[DependsOn]特性若有则按序加载所有依赖的模块也就是链式动态依赖加载。然后再依次调用Module的PreInitializeInitialize和PostInitialize以完成初始化。 好了模块的启动加载就讲到这里感兴趣的还是建议大家直接看看源码。 这里推荐一篇文章ABP源码分析三ABP Module来帮助大家理解Abp的模块化思想。
4. 总结
这一节有点标题党的味道但内容也算点题了。下一篇我将介绍微信公众号模块如何通过WebApi与系统进行交互尽情期待。 作者圣杰 链接https://www.jianshu.com/p/1e6efd9be629 来源简书 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。