[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

1
2
3
4
5
6
public class AbpModule
{
    public virtual void PreInitialize() { }
    public virtual void Initialize() { }
    public virtual void PostInitialize() { }
}

 

定义2个module

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
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

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
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());
    }
}

 

执行

1
2
3
4
5
6
7
8
9
10
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

posted @   Never、C  阅读(1935)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示