文档目录

本节内容:

简介

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. SQLSERVER走起微信公众帐号全新改版 全新首页

    SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...

  2. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  3. 【原】Github+Hexo+NextT搭建个人博客

    摘要 GitHub 是一个开源项目的托管网站,相信很多人都听过.在上面有很多高质量的项目代码,我们也可以把自己的项目代码托管到GitHub,与朋友们共享交流.GitHub Pages 是Github为 ...

  4. 常见CSS与HTML使用误区

       误区一.多div症 <div class="nav"> <ul> <li><a href="/home/"> ...

  5. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  6. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  7. 异步 HttpContext.Current 为空null 另一种解决方法

    1.场景 在导入通讯录过程中,把导入的失败.成功的号码数进行统计,然后保存到session中,客户端通过轮询显示状态. 在实现过程中,使用的async调用方法,出现HttpContext.Curren ...

  8. javascript动画系列第四篇——拖拽改变元素大小

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

  9. python 数据类型---文件二

    1.打印进度条 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() #不等缓冲 ...

  10. Lind.DDD.LindMQ的一些想法

    回到目录 很久就想写一套属于自己的消息队列组件,前段时候看了汤雪华同学的EQueue,感觉还是不错的,他也是看了rabbitMQ之后写的Equeue,在设计上与前者有类似的地方,而大叔这次准备写一个L ...