[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应 ...
随机推荐
- LeetCode:Roman to Integer,Integer to Roman
首先简单介绍一下罗马数字,一下摘自维基百科 罗马数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000).按照下述的规则可以表示任意正整数.需要注意的是罗 ...
- GPRM/GNRMC定位信息的读取与解析
帧头 UTC时间 状态 纬度 北纬/南纬 经度 东经/西经 速度 $GPRMC hhmmss.sss A/V ddmm.mmmm N/S dddmm.mmmm E/W 节 方位角 UTC日期 磁偏角 ...
- 10个有关RESTful API良好设计的最佳实践
Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...
- mac os x安装ngigx+php fastcgi+mysql+memcache详细流程
Part 1: MacPorts Mac上装软件常用的是MacPorts和homebrew,这个软件会很方便地提供软件的安装.装这些前先得装Xcode,Xcode在appstore上有,一个多G,下载 ...
- brew 出现 git 错误的问题分析
现象 brew update的时候出现 gitcrash 分析 在brew update 的时候看见有 git gc 的字样,提示有在gc 的动作.到/usr/local/ 目录,直接运行 git ...
- windows7系统下如何安装windows xp系统(无法识别硬盘,删除隐藏分区)
一.硬盘模式的设置 要设置好硬盘模式,否则安装操作系统的时候,根本就不识别硬盘,自然无法安装操作系统了.此步骤主要是解决无法识别硬盘的问题. 首先,进入BIOS当中,一般在advanced当中,有一个 ...
- EF OnModelCreating
http://www.cnblogs.com/libingql/p/3353112.html protected override void OnModelCreating(DbModel ...
- LCLFramework框架之Plugin模式
插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...
- 菜鸟译文(三)——JDK6和JDK7中substring()方法的对比
substring(int beginIndex, int endIndex)方法在JDK6和JDK7中是不同的.了解他们的区别可以让我们更好的使用这个方法.方便起见,以下用substring() 代 ...
- CKEditor4.1和CKFinder2.3.1 for Mvc4最新 破解版,结合 打造"帅"的编辑器 For .Net
CKEditor4.1+CKFinder2.3.1 FOR MVC4 最新破解版:(2013-3-23) baidu share: http://pan.baidu.com/share/link?sh ...