文档目录

本节内容:

简介

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. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  2. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  3. 03.LoT.UI 前后台通用框架分解系列之——多样的表格

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

  4. android 使用Tabhost 发生could not create tab content because could not find view with id 错误

    使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...

  5. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  6. ABP领域层

    1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...

  7. 关于CSS inline-block、BFC以及外边距合并的几个小问题

    CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...

  8. LVM基本介绍与常用命令

    一.LVM介绍LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制LVM - 优点:LVM通常用于装备大量磁盘的系统,但它同样适 ...

  9. 安装并使用PHPunit

    安装并使用PHPunit Linux 下安装PHPunit PHP 档案包 (PHAR)  要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包 (PHAR),它将 PHPU ...

  10. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...