你的位置:首页 > ASP.net教程

[ASP.net教程]ASP.NET Boilerplate 文档 1.3 模块系统


文档目录

 

本节内容:

  • 简介
  • 模块定义
  • 生命周期方法
    • PreInitialize(预初始化)
    • Initialize(初始化)
    • PostInitialize(提交初始化)
    • Shutdown(关闭)
  • 模块依赖
  • 插件模块
    • Asp.net Core
    • Asp.net Mvc,Web Api
      • 插件中的控制器
  • 附加程序集
  • 自定义模块方法
  • 模块配置
  • 模块生命期

 

简介

 ABP为创建模块及组织它们提供基础框架。一个模块可依赖于另一个模块。通常地,一个程序集做为一个模块。如果你的应用是多个程序集,建议为每个程序集定义一个模块。

模块系统目前把焦点放在服务端上而不是客户端。

 

模块定义

一个模块定义成一个继承于AppModule类的类。 假设我们正在开发一个能用于不同应用的Blog模块,最简单的模块定义可能像如下所示:

public class MyBlogApplicationModule : AbpModule{  public override void Initialize()  {     IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());  }}

模块定义类负责把自己的类注册到依赖注入里(约定做法如上所示)、配置应用和其它模块、为应用添加新的特性等...

 

生命周期方法

ABP在应用启动和关闭时,为模块调用一些特定的方法。你可以重写这些方法来执行一些特定的任务。

ABP按依赖关系顺序调用这些方法。如果模块A依赖于模块B,模块B会在模块A前初始化,确切的启动方法顺序是:预初始化B,预初始化A,初始化B,提交B和提交A。这就是依赖路线。Shutdown方法类似,不过顺序是相反的。

 

PreInitialize(预初始化)

应用启动时最先调用这个方法,它通常在初始化前configure(配置)框架或是其它模块。

同样,你也可以在这里写一些特定的代码运行在依赖注入注册之前。例如,你想创建一个约定注册(Conventional Registration)类,你应该在这里使用IcoManager.AddConventionalRegisterer方法来注册这个类。

 

Initialize(初始化)

依赖注入注册一般都在这里完成,一般都使用IcoManager.RegisterAssemblyByConvention方法。如果你想自定义依赖注册,请查看dependency injection documentation.

 

PostInitialize(提交初始化)

在启动过程中最后调用这个方法,此时可以安全的解析依赖。

 

Shutdown(关闭)

当应用关闭时调用这个方法。

 

模块依赖

一个模块可以依赖于其它模块,它要求使用DenpendsOn特性显式地声明依赖关系,如下:

[DependsOn(typeof(MyBlogCoreModule))]public class MyBlogApplicationModule : AbpModule{  public override void Initialize()  {    IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());  }}

由于我们声明MyBlogApplicationModule依赖于MyBlogCoreModule,所以MyBlogCoreModule会在MyBlogApplicationModule前初始化。

ABP可以从startup模块解析依赖并按顺序初始化它们。

 

插件模块

尽管ABP解析是从startup模块开始到所有依赖,但也可以动态加载模块。AbpBootstrapper类定义PlugInSpurces属性,该属性用来就是用来添加源到动态加载插件模块,一个插件源可以是任何实现了IPlugInSource接口的类,PlugInFolderSource类实现了这个接口,并指明在某个文件夹下的程序集里获取一个插件模块。

Asp.net Core

译注:暂略

 

Asp.net Mvc,Web Api

在经典的Asp.net Mvc应用里,我们可以重写global.asax里的Application_Start来添加文件夹插件,如下所示:

public class MvcApplication : AbpWebApplication<MyStartupModule>{  protected override void Application_Start(object sender, EventArgs e)  {    AbpBootstrapper.PlugInSources.AddFolder(@"C:\MyPlugIns");    //...    base.Application_Start(sender, e);  }}

 

插件中的控制器

如果你的模块包含MVC或Web Api控制器,Asp.net不会检查你的控制器,为解决这个问题,你可以修改global.asax文件,如下:

using System.Web;using Abp.PlugIns;using Abp.Web;using MyDemoApp.Web;[assembly: PreApplicationStartMethod(typeof(PreStarter), "Start")]namespace MyDemoApp.Web{  public class MvcApplication : AbpWebApplication<MyStartupModule>  {  }  public static class PreStarter  {    public static void Start()    {      //...      MvcApplication.AbpBootstrapper.PlugInSources.AddFolder(@"C:\MyPlugIns\");      MvcApplication.AbpBootstrapper.PlugInSources.AddToBuildManager();    }  }}

 

附加程序集

IAssemblyFinder和ITypeFinder(ABP用来检查指定类)的默认实现仅仅在自身程序集中查找模块和类型。我们可以在我们的模块重写GetAdditionalAssemblies方法来附加程序集。

 

自定义模块方法

你的模块同样可以自定义方法,其它依赖于该模块的模块,就可以使用这些方法。假设MyModule2依赖于MyModule1,想在预初始化时调用MyModule1里的一个方法。

public class MyModule1 : AbpModule{  public override void Initialize()  {    IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());  }  public void MyModuleMethod1()  {    //this is a custom method of this module  }}[DependsOn(typeof(MyModule1))]public class MyModule2 : AbpModule{  private readonly MyModule1 _myModule1;  public MyModule2(MyModule1 myModule1)  {    _myModule1 = myModule1;  }  public override void PreInitialize()  {    _myModule1.MyModuleMethod1(); //Call MyModule1's method  }  public override void Initialize()  {    IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());  }}

此处,用构造器注入MyModule1给MyModule2,所以MyModule2可以调用MyModule1的自定义方法,这仅在Module2依赖于Module1的情况下可用。

 

模块配置

尽管自定义模块方法能配置模块,但我们建议使用启动配置(startup configuration)系统为模块定义和设置配置。

 

模块生命期

模块类自动地被注册成单例。