[Architect] Abp 框架原理解析(1) Module
本节目录
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的更多相关文章
- [Architect] Abp 框架原理解析(5) UnitOfWork
本节目录 介绍 分析Abp源码 实现UOW 介绍 UOW(全称UnitOfWork)是指工作单元. 在Abp中,工作单元对于仓储和应用服务方法默认开启.并在一次请求中,共享同一个工作单元. 同时在Ab ...
- [Architect] Abp 框架原理解析(4) Validation
本节目录 介绍 DataAnnotations ICustomValidate IShouldNormalize 实现Abp Validation 介绍 Abp中在Application层集成了val ...
- [Architect] Abp 框架原理解析(3) DynamicFilters
本节目录 介绍 定义Filter 设置Filter 这是Abp中多租户.软删除.激活\禁用等如此方便的原因 Install-Package EntityFramework.DynamicFilters ...
- [Architect] Abp 框架原理解析(2) EventBus
本节目录 原理介绍 Abp源码分析 代码实现 原理介绍 事件总线大致原理: (1) 在事件总线内部维护着一个事件与事件处理程序相映射的字典. (2) 利用反射,事件总线会将实现 ...
- seajs1.3.0源码解析之module依赖有序加载
/** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改 ...
- Nodejs源码解析之module
modulejs的导入 Require函数详解 module路径解析 module.js的导入 module.js是由node.js在Nodejs程序启动的时候导入的.module.js中使用的req ...
- 通俗理解ABP中的模块Module
网上有不少文章说ABP的模块,有的直接翻译自官网介绍,有的分析Modlue的源代码,有的写一通代码,没什么注释,很少有能通俗说清的.那么,有两个问题:1.ABP中的模块到底是什么?2.搞这个东西是干嘛 ...
- [Architect] ABP(现代ASP.NET样板开发框架) 翻译
所有翻译文档,将上传word文档至GitHub 本节目录: 简介 代码示例 支持的功能 GitHub 简介 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目) ...
- ABP架构解析
ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
随机推荐
- RPC 135端口
- crontab使用方法和示例
crond是linux中的一个定时任务常驻程序,它会在每分钟检查一次作业列表,从而达到在指定时间自动运行指定的作业,这个程序对于系统运维来讲必不可少. 通常我们使用crontab程序来设定和管理作业的 ...
- 简单配置nginx使之支持pathinfo
只需要修改3个地方就可以了 location ~ \.php { #去掉$ root H:/PHPServer/WWW; fastcgi_pass 127.0.0.1:90 ...
- MediaPlayer 播放assets 文件夹下面的视频报错
Android MediaPlayer 播放assets 文件夹下面的视频报错 报下面的错: java.io.FileNotFoundException: This file can not be o ...
- jQuery UI--jquery-autohide解读
// jQuery Autohide v1.0.2 // (c) 2014 Alex Taujenis // MIT License (function($) { return $.fn.autohi ...
- python + hadoop (案例)
python如何链接hadoop,并且使用hadoop的资源,这篇文章介绍了一个简单的案例! 一.python的map/reduce代码 首先认为大家已经对haoop已经有了很多的了解,那么需要建立m ...
- Java IO 之 OutputStream源码
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 转载 jquery $(document).ready() 与window.onload的区别
Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...
- 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)
前言 初次见面的朋友们大家好,这篇文章是"无插件纯web 3D机房"系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: 无插件纯web 3D机房(第一季:从零开始搭建 ...
- 关于welcome-file-list(欢迎页)不起作用的解决办法
今天我遇到了一个问题,就是直接输入http://localhost:8080/xxx-admin/,不是跳转到index.html,而是报404找不到的错误,根据错误信息看明显是没有跳转到index. ...