文档目录

本节内容:

简介

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)系统为模块定义和设置配置。

模块生命期

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

ABP框架 - 模块系统的更多相关文章

  1. ABP之模块系统

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

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

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

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

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

  4. ABP模块系统

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

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

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

  6. 手工搭建ABP框架(1) - Web项目

    为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7295533.html ABP是 ASP.NET Boilerplate Proj ...

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

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

  8. [ABP]浅谈模块系统与 ABP 框架初始化

    在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...

  9. 浅谈模块系统与 ABP 框架初始化

    在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...

随机推荐

  1. 【AR实验室】ARToolKit之Example篇

    0x00 - 前言 PS : 我突然意识到ARToolKit本质可能就是一个可以实时求解相机内外参的解决方案. 拿到一个新的SDK,90%的人应该都会先跑一下Example.拿到ARToolKit的S ...

  2. 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  3. 卡片抽奖插件 CardShow

    这个小项目(卡片秀)是一个卡片抽奖特效插件,用开源项目这样的词语让我多少有些羞愧,毕竟作为一个涉世未深的小伙子,用项目的标准衡量还有很大差距.不过该案例采用 jQuery 插件方式编写,提供配置参数并 ...

  4. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  5. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  6. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  7. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

  8. SQLite学习笔记(十)&&加密

    随着移动互联网的发展,手机使用越来越广泛,sqlite作为手机端存储的一种解决方案,使用也非常普遍.但是sqlite本身安全特性却比较弱,比如不支持用户权限,只要能获取到数据库文件就能进行访问:另外也 ...

  9. Bluemix中国版体验(二)

    从上一篇到现在大概有一个多月了.时隔一个月再登录中国版Bluemix,发现界面竟然更新了,现在的风格和国际版已经基本保持一致!这次我们来体验一下Mobile Service.不过mobile serv ...

  10. servlet使用入门

    创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...