Abp 源码分析:四、模块配置

0.简要介绍 在 Abp 框架当中通过各种 Configuration 来实现模块的配置,Abp 本身提供的很多基础设施功能的一些在运行时的行为是通过很多不同的 Configuration 来开放给用户进行一些自定义配置的。 比如说缓存模块,我要配置缓存的过期时间,Abp 默认是 1 个小时,但是我也可以自己来定义,直接赋值或者从配置项来读取都是由具体使用者来控制的,所以 Abp 通过各种 Configuration 类来控制一些运行时参数。 这些 Abp 本身基础设施的配置类都是存放在 \Abp\src\Abp\Configuration\Startup\ 这个文件夹内部的,我们来看一下他们的依赖关系。 1.启动流程 从上图可以看到在 IAbpStartupConfiguration 内部拥有诸多引用(可能没有列举完成,可以在其定义看到),基本上 Abp 自己的基础设施配置都在这里面。 那么 IAbpStartupConfiguration 自己内部的这些属性是在哪儿初始化的呢,其实就是在之前讲过的 AbpBootstrapper 的 Initialize() 内部初始化的。再看下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public virtual void Initialize() { try { // 其他代码 IocManager.IocContainer.Install(new AbpCoreInstaller()); IocManager.Resolve<AbpStartupConfiguration>().Initialize(); // 其他代码 } catch (Exception ex) { _logger.Fatal(ex.ToString(), ex); throw; } } 在 AbpCoreInstaller 类内部之前也说过,在这里面统一注入了这些 Configuration 的单例,同时解析出 AbpStartupConfiguration ,调用其 Initialzie() 方法来对自己的那些 xxxConfiguration 接口赋值,代码如下:

Abp 源码分析:三、依赖注入

0.简要介绍 在 Abp 框架里面,无时无刻不存在依赖注入,关于依赖注入的作用与好处我就不在这里多加赘述了,网上有很多解释的教程。在 [Abp 源码分析]一、Abp 框架启动流程分析 里面已经说过,Abp 本身在框架初始化的时候我们就可以看到它使用 Castle Windsor 将 Asp.Net Core 自带的 IServiceProvider 替换掉了。 1.大体结构 在 Abp 框架当中,它的依赖注入相关的类型基本上都放在 Abp 项目的 Dependency 文件夹里面,下图是他们之间的依赖关系: 2 代码解析 2.1 基本实现 IIocManager 是直接继承 IIocRegistrar 与 IIocResolver 的一个接口,通过名称我们就可以看出来他们的作用,IIocRegistrar 内部提供了组件注册的方法定义,而 IIocResolver 内部则是提供了解析已经注入的组件方法。在 IIocManager 本身则是封装了一个 Castle Windsor 的 Ioc 容器,定义如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 /// <summary> /// This interface is used to directly perform dependency injection tasks.

使用 C# 代码实现拓扑排序

0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用。 https://www.codeproject.com/Articles/869059/Topological-sorting-in-Csharp https://songlee24.github.io/2015/05/07/topological-sorting/ https://www.cnblogs.com/skywang12345/p/3711483.html 1.介绍 自己之前并没有接触过拓扑排序,顶多听说过拓扑图。在写前一篇文章的时候,看到 Abp 框架在处理模块依赖项的时候使用了拓扑排序,来确保顶级节点始终是最先进行加载的。第一次看到觉得很神奇,看了一下维基百科头也是略微大,自己的水平也是停留在冒泡排序的层次。ヽ(≧□≦)ノ 看了第二篇参考资料才大致了解,在此记录一下。 2.原理 先来一个基本定义: 在图论中,**拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)**的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。 例如,有一个集合它的依赖关系如下图: 可以看到他有一个依赖关系: Module D 依赖于 Module E 与 Module B 。 Module E 依赖于 Module B 与 Module C 。 Module B 依赖于 Module A 与 Module C 。 Module C 依赖于 Module A 。 Module A 无依赖 。 这个就是一个 DAG 图,我们要得到它的拓扑排序,一个简单的步骤如下:

Abp 源码分析:二、模块系统

0.简介 整个 Abp 框架由各个模块组成,基本上可以看做一个程序集一个模块,不排除一个程序集有多个模块的可能性。可以看看他官方的这些扩展库: 可以看到每个项目文件下面都会有一个 xxxModule 的文件,这里就是存放的模块文件,一个模块拥有四个生命周期,分别为 PreInitialize()(预加载)、Initialize()(初始化)、PostInitialize(初始化完成)、Shutdown()(销毁),前三个根据我们上一篇文章的代码可以看到,他是先执行预加载方法,然后执行初始化,最后执行初始化完成方法,销毁方法则是程序退出的时候执行。 模块的主要作用就是在 Abp 框架加载的时候程序集执行初始化操作的,比如说 Abp 库自身的 AbpKernelModule 模块,里面就是各种注入基础设施,执行初始化操作。 可以看看其中代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 public sealed class AbpKernelModule : AbpModule { public override void PreInitialize() { // 注册各种过滤器与基础组件 IocManager.

Abp 源码分析:一、Abp 框架启动流程分析

Abp 不一定仅用于 Asp.Net Core 项目,他也可以在 Console 与 WinFrom 项目当中进行使用,所以关于启动流程可以分为两种,一种是 Asp.Net Core 项目的启动流程,另外则是 ConsoleApplication/WinFrom 项目的启动流程,在这里我则是通过 Asp.Net Core 项目的启动流程来分析,但是他们的核心都是 AbpBootstrapper 这个类。 本文章基于 Abp 框架的最新版本 v3.7.2 。 一、Abp 的入口点 1.1 添加服务与启用中间件 要在 Asp.Net Core 项目当中使用 Abp 框架的话,第一步当然是先添加 Abp.AspNetCore 库啦,之后在我们 Startup 类的 ConfigureAbpService(IServiceCollection services) 方法里面使用 AddAbp<TStartupModule>。比如像这样: 1 2 3 4 public IServiceProvider ConfigureServices(IServiceCollection services) { return services.AddAbp<HKAbpDemoHostModule>(); } 注意,这里我们 ConfigureService 返回类型变成了 IServiceProvider ,这是因为在 AddAbp 方法内部替换了 Ioc 容器,变成了 CastleWindsor,后面会接着分析的。 然后我们的 Configure(IApplicationBuilder app, IHostingEnvironment env) 方法里面也会有如下代码:
Built with Hugo
主题 StackJimmy 设计