[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应 ...
随机推荐
- java list中的对象去重原理
/******************************************************************************* * * Copyright (c) W ...
- <后会无期>经典影评
先说明是转载,任何不同意见请对原作者表达,楼主不作任何回应,楼主影商极低,楼主觉得这二十几年来看的最好的电影是<一代宗师>,楼主只是觉得这篇影评精彩才发布上来让更多的人看到.原作者意见和楼 ...
- ASP.NET MVC路由规则
1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...
- Microsoft Fakes
http://baike.baidu.com/view/9602275.htm?fr=aladdin http://technet.microsoft.com/zh-cn/magazine/hh549 ...
- zxing扫码--镭射线
同步发表于http://avenwu.net/2015/09/15/zxing_view_finder_laser 在很多应用中都有二维码扫描的需求,比如微信,通过扫描电脑二维码,实现用户登录授权: ...
- IIS兼容模式设置
X-UA-Compatible IE=EmulateIE7 来自为知笔记(Wiz)
- JRE_HOME environment variable is not defined correctly This environment variableis needed to run this program
已经安装了JDK1.7 和对应JRE 安装了tomcat8 都是解压版 并设置了JAVA_HOME.JRE_HOME 但Tomcat在启动过程中找不到 错误: the JRE_HOME environ ...
- SOA架构改造简单记录
前端支持PC.Mobile.H5三个平台 nginx做负载均衡,主备机,keepalived,检测脚本,master和slave切换时完成相关工作: web做集群,web仅仅是web,与后端服务模块采 ...
- Struts2的属性驱动与模型驱动的区别
1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...
- 初探Stage3D(二) 了解AGAL
关于本文 本文并无打算事无巨细的介绍一遍AGAL,仅仅是对现有文档的一些理解及汇总,所以请先阅读相参考文档 AGAL概念 参考资料 http://www.adobe.com/devnet/flashp ...