本节目录

Abp介绍

学习了一段时间的Abp,领略了一下前辈的架构.总结还是SOLID,降低耦合性.

虽然从架构上说甚至不依赖于DI框架,但实际上在基础框架中还是有一定的必须依赖Castle Windsor.

Abp依靠IOC和AOP实现了大量的自动化.

其中Module设计,是Abp的核心.

Abp源码分析

Abp的入口:AbpBootstrapper.Initialize()

此方法中做了各种配置的注册及初始化.

最重要的是AbpModuleManager的初始化.

在这个初始化代码中

先查询出所有的module,根据依赖关系排序后.并保证AbpKernelModule为第一.

然后初始化module,所有module依次调用PreInitialize、Initialize、PostInitialize

代码实现

定义AbpModule

    public class AbpModule
{
public virtual void PreInitialize() { }
public virtual void Initialize() { }
public virtual void PostInitialize() { }
}

定义2个module

    public class ApplicationModule : AbpModule
{
public override void PreInitialize()
{
Console.WriteLine("ApplicationModule's PreInitialize is called");
} public override void Initialize()
{
Console.WriteLine("ApplicationModule's Initialize is called");
} public override void PostInitialize()
{
Console.WriteLine("ApplicationModule's PostInitialize is called");
}
} public class CoreModule : AbpModule
{
public override void PreInitialize()
{
Console.WriteLine("CoreModule's PreInitialize is called");
} public override void Initialize()
{
Console.WriteLine("CoreModule's Initialize is called");
} public override void PostInitialize()
{
Console.WriteLine("CoreModule's PostInitialize is called");
}
}

定义IoCManager

    public class IocManager
{
public static IocManager Instance { get; private set; } public IWindsorContainer IocContainer { get; private set; } static IocManager()
{
Instance = new IocManager();
} public IocManager()
{
IocContainer = new WindsorContainer();
//Register self!
IocContainer.Register(
Component.For<IocManager>().UsingFactoryMethod(() => this)
);
}
}

实现AbpBootstrapper

    public class AbpBootstrapper
{
public IocManager IocManager { get; private set; }
public AbpBootstrapper()
{
IocManager = IocManager.Instance;
}
public virtual void Initialize()
{
InitializeModules();
}
private void InitializeModules()
{
var types = Assembly.GetExecutingAssembly().GetTypes();
var moduleTypes = new List<Type>();
var modules = new List<AbpModule>();
foreach (var type in types)
{
if (typeof(AbpModule).IsAssignableFrom(type))
{
moduleTypes.Add(type);
IocManager.IocContainer.Register(Component.For(type));
}
}
foreach (var module in moduleTypes)
{
var obj = IocManager.IocContainer.Resolve(module) as AbpModule;
modules.Add(obj);
}
modules.ForEach(x => x.PreInitialize());
modules.ForEach(x => x.Initialize());
modules.ForEach(x => x.PostInitialize());
}
}

执行

    class Program
{
static void Main(string[] args)
{
var booter = new AbpBootstrapper();
booter.Initialize(); Console.ReadKey();
}
}

Abp原理如上,只是在本例中并未做dependency排序处理.

在Abp中的排序依赖ListExtensions类对List的扩展方法实现的.

本文地址:http://neverc.cnblogs.com/p/5249103.html

[Architect] Abp 框架原理解析(1) Module的更多相关文章

  1. [Architect] Abp 框架原理解析(5) UnitOfWork

    本节目录 介绍 分析Abp源码 实现UOW 介绍 UOW(全称UnitOfWork)是指工作单元. 在Abp中,工作单元对于仓储和应用服务方法默认开启.并在一次请求中,共享同一个工作单元. 同时在Ab ...

  2. [Architect] Abp 框架原理解析(4) Validation

    本节目录 介绍 DataAnnotations ICustomValidate IShouldNormalize 实现Abp Validation 介绍 Abp中在Application层集成了val ...

  3. [Architect] Abp 框架原理解析(3) DynamicFilters

    本节目录 介绍 定义Filter 设置Filter 这是Abp中多租户.软删除.激活\禁用等如此方便的原因 Install-Package EntityFramework.DynamicFilters ...

  4. [Architect] Abp 框架原理解析(2) EventBus

    本节目录 原理介绍 Abp源码分析 代码实现 原理介绍 事件总线大致原理: (1)       在事件总线内部维护着一个事件与事件处理程序相映射的字典. (2)       利用反射,事件总线会将实现 ...

  5. seajs1.3.0源码解析之module依赖有序加载

    /** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改 ...

  6. Nodejs源码解析之module

    modulejs的导入 Require函数详解 module路径解析 module.js的导入 module.js是由node.js在Nodejs程序启动的时候导入的.module.js中使用的req ...

  7. 通俗理解ABP中的模块Module

    网上有不少文章说ABP的模块,有的直接翻译自官网介绍,有的分析Modlue的源代码,有的写一通代码,没什么注释,很少有能通俗说清的.那么,有两个问题:1.ABP中的模块到底是什么?2.搞这个东西是干嘛 ...

  8. [Architect] ABP(现代ASP.NET样板开发框架) 翻译

    所有翻译文档,将上传word文档至GitHub 本节目录: 简介 代码示例 支持的功能 GitHub 简介 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目) ...

  9. ABP架构解析

    ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

随机推荐

  1. RPC 135端口

  2. crontab使用方法和示例

    crond是linux中的一个定时任务常驻程序,它会在每分钟检查一次作业列表,从而达到在指定时间自动运行指定的作业,这个程序对于系统运维来讲必不可少. 通常我们使用crontab程序来设定和管理作业的 ...

  3. 简单配置nginx使之支持pathinfo

    只需要修改3个地方就可以了 location ~ \.php {    #去掉$ root          H:/PHPServer/WWW; fastcgi_pass   127.0.0.1:90 ...

  4. MediaPlayer 播放assets 文件夹下面的视频报错

    Android MediaPlayer 播放assets 文件夹下面的视频报错 报下面的错: java.io.FileNotFoundException: This file can not be o ...

  5. jQuery UI--jquery-autohide解读

    // jQuery Autohide v1.0.2 // (c) 2014 Alex Taujenis // MIT License (function($) { return $.fn.autohi ...

  6. python + hadoop (案例)

    python如何链接hadoop,并且使用hadoop的资源,这篇文章介绍了一个简单的案例! 一.python的map/reduce代码 首先认为大家已经对haoop已经有了很多的了解,那么需要建立m ...

  7. Java IO 之 OutputStream源码

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  8. 转载 jquery $(document).ready() 与window.onload的区别

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...

  9. 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)

    前言 初次见面的朋友们大家好,这篇文章是"无插件纯web 3D机房"系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: 无插件纯web 3D机房(第一季:从零开始搭建 ...

  10. 关于welcome-file-list(欢迎页)不起作用的解决办法

    今天我遇到了一个问题,就是直接输入http://localhost:8080/xxx-admin/,不是跳转到index.html,而是报404找不到的错误,根据错误信息看明显是没有跳转到index. ...