ABP之模块系统

简介

ASP.NET Boilerplate提供了构建模块的基础结构,并将它们组合在一块儿以建立应用程序。 模块能够依赖于另外一个模块。 一般,一个程序集被视为一个模块。 若是建立具备多个程序集的应用程序,建议您为每一个程序集建立一个模块定义。web

模块系统目前专一于服务端,而不是客户端。api

模块定义

定义一个派生自ABP包中的AbpModule的类做为一个模块。假设咱们如今正在开发一个能够在不一样应用程序中使用的Blog模块。最简单的模块定义以下:安全

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

若是须要,模块定义类负责经过依赖注入(DI)来注册它的类(它能够按常规方式完成,如上所示)。 它还能够配置应用程序和其余模块,为应用程序添加新功能等等......mvc

生命周期方法

ABP在应用程序启动和关闭时调用某些特定的模块方法。咱们能够覆盖这些方法去执行特定的任务。ABP按照依赖顺序来调用这些方法。若是模块A依赖于模块B,模块B就在模块A以前初始化。app

启动方法的正确顺序:PreInitialize-B,PreInitialize-A,Initialize-B,Initialize-A,PostInitialize-B和PostInitialize-A。 全部依赖图都是如此。 关闭方法也相似,但顺序相反。框架

预初始化(PreInitialize)ide

当应用程序启动时,首先调用此方法。它是在初始化以前配置框架和其余模块要执行的方法。函数

咱们也能够在这里编写一些特定的代码,而后在依赖注入注册以前执行。例如,若是是建立传统的注册类,则应使用IocManager.AddConventionalRegisterer方法在此处注册。ui

初始化(Initialize)this

这是应该完成依赖注入注册的地方,它一般使用IocManager.RegisterAssemblyByConvention方法完成。也能够自定义依赖注入注册,到时请参阅依赖注入文档(后续写了会加连接)。

初始化后(PostInitialize)

此方法在启动过程当中最后调用。 在这里解决依赖是安全的。

关闭(Shutdown)

应用程序关闭时调用此方法。

模块依赖

模块能够依赖于另外一个模块。 咱们须要使用DependsOn属性显式声明依赖项,以下所示:

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

在这里,咱们声明MyBlogApplicationModule依赖于MyBlogCoreModule,而且MyBlogCoreModule应在MyBlogApplicationModule以前初始化。

ABP能够从启动模块开始递归地解析依赖关系并相应地初始化它们,启动模块初始化为最后一个模块。

插件模块(PlugIn Modules)

虽然从启动模块开始经过依赖项调查模块,但ANP也能够动态加载模块,AbpBootstrapper类定义了PlugInSources属性,该属性可用于添加资源以动态加载插件模块。插件源能够是实现IPlugInSource接口的任何类, PlugInFolderSource类实现从文件夹中的程序集获取插件模块。

ASP.NET Core

ABP ASP.NET Core在AddAbp扩展方法中定义选项,就是为了实如今Startup类中添加插件源。

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.Add(new FolderPlugInSource(@"C:\MyPlugIns"));
});

咱们也能够调用AddFolder来实现最简单的语法。

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.AddFolder(@"C:\MyPlugIns");
});

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);
    }
}

PlugIns中的控制器

若是你的模块包含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并想要在PreInitialize方法中调用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时才能够这样作。

模块配置

虽然可使用自定义模块方法配置模块,但咱们建议您使用启动配置系统来定义和设置模块的配置。

模块声明周期模块类被自动注册为单例模式。

相关文章
相关标签/搜索