点这里进入ABP系列文章总目录html
基于DDD的现代ASP.NET开发框架--ABP系列之四、ABP模块系统
git
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。github
ABP的官方网站:http://www.aspnetboilerplate.com架构
ABP在Github上的开源项目:https://github.com/aspnetboilerplate框架
本文由东莞-天道提供翻译 ide
ABP框架提供了建立和组装模块的基础,一个模块可以依赖于另外一个模块。在一般状况下,一个程序集就能够当作是一个模块。在ABP框架中,一个模块经过一个类来定义,而这个类要继承自AbpModule。学习
译者注:若是学习过Orchard的朋友,应该知道module模块的强大了。模块的本质就是可重用性,你能够在任意的地方去调用,并且经过实现模块,你写的模块也能够给别人用。网站
Assembly程序集:Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。最简单的理解就是:一个你本身写的类库生成的dll就能够看作是一个程序集,这个程序集能够包括不少类,类又包括不少方法等。
.net能够经过反射获取一个程序集中的类以及方法。spa
下面的例子,咱们开发一个能够在多个不一样应用中被调用MybolgApplication模块,代码以下: .net
public class MyBlogApplicationModule : AbpModule //定义 { public override void Initialize() //初始化 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); //这行代码的写法基本上是不变的。它的做用是把当前程序集的特定类或接口注册到依赖注入容器中。 } }
ABP框架会扫描全部的程序集,而且发现AbpModule类中全部已经导入的全部类,若是你已经建立了包含多个程序集的应用,对于ABP,咱们的建议是为每个程序集建立一个Module(模块)。
在一个应用中,abp框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操做。咱们能够重载这些方法来完成咱们本身的任务。
ABP框架经过依赖关系的顺序来调用这些方法,假如:模块A依赖于模块B,那么模块B要在模块A以前初始化,模块启动的方法顺序以下:
下面是具体方法的说明:
预初始化:当应用启动后,第一次会调用这个方法。在依赖注入注册以前,你能够在这个方法中指定本身的特别代码。举个例子吧:假如你建立了一个传统的登记类,那么你要先注册这个类(使用IocManager对登记类进行注册),你能够注册事件到IOC容器。等。
初始化:在这个方法中通常是来进行依赖注入的注册,通常咱们经过IocManager.RegisterAssemblyByConvention这个方法来实现。若是你想实现自定义的依赖注入,那么请参考依赖注入的相关文档。
提交初始化:最后一个方法,这个方法用来解析依赖关系。
关闭:当应用关闭之后,这个方法被调用。
Abp框架会自动解析模块之间的依赖关系,可是咱们仍是建议你经过重载GetDependencies方法来明确的声明依赖关系。
[DependsOn(typeof(MyBlogCoreModule))]//经过注解来定义依赖关系 public class MyBlogApplicationModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
例如上面的代码,咱们就声明了MyBlogApplicationModule和MyBlogCoreModule的依赖关系(经过属性attribute),MyBlogApplicationModule这个应用模块依赖于MyBlogCoreModule核心模块,而且,MyBlogCoreModule核心模块会在MyBlogApplicationModule模块以前进行初始化。
咱们本身定义的模块中可能有方法被其余依赖于当前模块的模块调用,下面的例子,假设模块2依赖于模块1,而且想在预初始化的时候调用模块1的方法。
public class MyModule1 : AbpModule { public override void Initialize() //初始化模块 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这里,进行依赖注入的注册。 } public void MyModuleMethod1() { //这里写自定义的方法。 } } [DependsOn(typeof(MyModule1))] public class MyModule2 : AbpModule { private readonly MyModule1 _myModule1; public MyModule2(MyModule1 myModule1) { _myModule1 = myModule1; } public override void PreInitialize() { _myModule1.MyModuleMethod1(); //调用MyModuleMethod1的方法。 } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
就这样,就把模块1注入到了模块2,所以,模块2就能调用模块1的方法了。
阳铭注:
ABP的模块系统与Orchard的模块有相似之处,但仍是有比较大的差异。Orchard的框架修改了ASP.NET程序集的默认加载方式(模块的DLL没有放在Bin文件夹下,是放在WEB项目根文件夹下面的Modules文件夹下),实现了功能模块的热插拔,而ABP的模块程序集仍是放在Bin文件夹下的,没有实现热插拔。
但愿更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目能够发展得更好。
欢迎加QQ群:
ABP架构设计交流群:134710707 ABP架构设计交流2群: 579765441