简介

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

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

模块定义

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

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

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

生命周期方法

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

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

预初始化(PreInitialize)

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

我们也可以在这里编写一些特定的代码,然后在依赖注入注册之前执行。例如,如果是创建传统的注册类,则应使用IocManager.AddConventionalRegisterer方法在此处注册。

初始化(Initialize)

这是应该完成依赖注入注册的地方,它通常使用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时才可以这样做。

模块配置

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

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

ABP之模块系统的更多相关文章

  1. ABP框架 - 模块系统

    文档目录 本节内容: 简介 模块定义 生命周期方法 PreInitialize(预初始化) Initialize(初始化) PostInitialize(提交初始化) Shutdown(关闭) 模块依 ...

  2. ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  3. ABP模块系统

    ABP模块系统 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP ...

  4. ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...

  5. ABP文档笔记 - 模块系统 及 配置中心

    ABP框架 - 模块系统 ABP框架 - 启动配置 Module System Startup Configuration ABP源码分析三:ABP Module ABP源码分析四:Configura ...

  6. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  7. [Abp 源码分析]二、模块系统

    0.简介 整个 Abp 框架由各个模块组成,基本上可以看做一个程序集一个模块,不排除一个程序集有多个模块的可能性.可以看看他官方的这些扩展库: 可以看到每个项目文件下面都会有一个 xxxModule ...

  8. 【ABP框架系列学习】模块系统(4)

    0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施.一个模块可以依赖于另外一个模块.通常,程序集可以认为是模块.如果创建多个程序集的应用程序,建议为每个程序集创建模块定义. 当前,模 ...

  9. abp 模块系统

    abp模块系统:ABP理论学习之模块系统 ABP提供了构建模块并将这些模块组合起来创建应用的基础设施.一个模块可以依赖另一个模块.一般来说,一个程序集可以认为是一个模块.一个模块是由一个派生了AbpM ...

随机推荐

  1. JAVA之enum类详解

    目录    一.简介    二.默认枚举类    三.多值枚举类    四.属性和方法    五.构造函数    六.重要方法    七.引用参考 一.简介    1.枚举类代表一组常量:    2. ...

  2. Python基础(set集合)

    #Author : Kelvin #Date : 2019/1/5 13:20 #set集合的创建(创建后可修改) li=["kelvin",1,2,"zhangsan& ...

  3. HandlerInterceptor里@Autowired对象为空的解决方法

    That's because Spring isn't managing your PagePopulationInterceptor instance. You are creating it yo ...

  4. Java进阶篇设计模式之一 ----- 单例模式

    前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...

  5. Node.js - 阿里Egg的多进程模型和进程间通讯

    前言 最近用Egg作为底层框架开发项目,好奇其多进程模型的管理实现,于是学习了解了一些东西,顺便记录下来.文章如有错误, 请轻喷 为什么需要多进程 伴随科技的发展, 现在的服务器基本上都是多核cpu的 ...

  6. C#,记录--一个方法中,完成对数据增删改操作

    实际应用中,一般不会使用delete彻底的删除数据,大多都是逻辑删除 为了不把本文写成小作文,举个小栗子吧 表 A,deletestate为置删除字段,int类型,值为0和1 表中五条数据 查询 se ...

  7. Spring Boot Security 整合 OAuth2 设计安全API接口服务

    简介 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.本文重点讲解Spring Boot项目对OAuth2进行的实现,如果你对OAut ...

  8. web前端图片上传(3)--filereader

    这篇文章主要是为了介绍一种文件上传的方式.当然文件中是包含图片的.如果大家仔细看我的第一篇web前端图片上传(1)就会知道,其实也是按照这种方式上传你的,但是由于上次时间比较紧张,没有详细的介绍今天的 ...

  9. Math.floor(Math.random()*3+1)

    Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and ret ...

  10. 关于图片适配不同尺寸的image View(实战)

    分享人:广州华软 佐罗 一. 前言 在前端开发过程中,设计稿中往往只提供一张图片,但是app内需要用到的尺寸各种各样. 同时图片不仅是信息的直接表达,也会为网站起到美观点缀的作用,图片的变形.过分裁切 ...