模块系统

介绍

ASP.NET Boilerplate提供了构建模块的基础结构,并将它们组合在一起以创建应用程序。模块可以依赖于另一个模块。通常,组件被视为模块。如果创建具有多个程序集的应用程序,建议您为每个程序集创建一个模块定义。

模块系统目前专注于服务器端而不是客户端。

模块定义

模块定义了一个派生自ABP包中的AbpModule的类假设我们正在开发一个可以在不同应用程序中使用的Blog模块。最简单的模块定义如下所示:

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

如果需要,模块定义类负责通过依赖注入来注册它的类 (它可以按常规方式完成,如上所示)。它还可以配置应用程序和其他模块,为应用程序添加新功能,等等......

生命周期方法

ASP.NET Boilerplate在应用程序启动和关闭时调用某些特定的模块方法。您可以覆盖这些方法以执行某些特定任务。

ASP.NET Boilerplate调用由dependecies排序的这些方法如果模块A依赖于模块B,则模块B在模块A之前初始化。

启动方法的确切顺序:PreInitialize-B,PreInitialize-A,Initialize-B,Initialize-A,PostInitialize-B和PostInitialize-A。所有依赖图都是如此。关闭方法也相似,但在相反的顺序

预初始化

当应用程序启动时,首先调用此方法。它是在初始化之前配置框架和其他模块的首选方法。

您还可以在此处编写一些特定代码,以便在依赖注入注册之前运行。例如,如果您创建传统的注册类,则应使用IocManager.AddConventionalRegisterer方法在此处注册它。

初始化

这是应该进行依赖注入注册的地方它通常使用IocManager.RegisterAssemblyByConvention方法完成。如果要定义自定义依赖项注册,请参阅 依赖项注入文档

初始化后

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

关闭

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

模块依赖性

模块可以依赖于另一个模块。您需要 使用DependsOn属性显式声明依赖项,如下所示:

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

在这里,我们向ASP.NET Boilerplate声明MyBlogApplicationModule依赖于MyBlogCoreModule,而MyBlogCoreModule应该在MyBlogApplicationModule之前初始化。

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

插件模块

虽然从启动模块开始调查模块并通过依赖项,但ABP也可以动态加载模块所述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");
});

有关Startup类的更多信息,请参阅ASP.NET Core文档

ASP.NET MVC,Web API

对于经典的ASP.NET MVC应用程序,我们可以通过重写添加插件文件夹的Application_StartGlobal.asax中,如下图所示:

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时才可以这样做。

模块配置

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

模块生命周期

模块类自动注册为单例

nidie.com.cn - 用心与你沟通