[Architect] Abp 框架原理解析(1) Module

本节目录

  • Abp介绍
  • Abp源码分析
  • 代码实现

 

Abp介绍

学习了一段时间的Abp,领略了一下前辈的架构.总结还是SOLID,降低耦合性.

虽然从架构上说甚至不依赖于DI框架,但实际上在基础框架中还是有一定的必须依赖Castle Windsor.

Abp依靠IOC和AOP实现了大量的自动化.

其中Module设计,是Abp的核心.

 

Abp源码分析

Abp的入口:AbpBootstrapper.Initialize()

此方法中做了各种配置的注册及初始化.

最重要的是AbpModuleManager的初始化.

 

在这个初始化代码中

先查询出所有的module,根据依赖关系排序后.并保证AbpKernelModule为第一.

然后初始化module,所有module依次调用PreInitialize、Initialize、PostInitialize

推荐:Andfix热修复框架原理及源码解析-下篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇  Andfix热修复框架原理及源码解析-下篇 如果没有看过上篇的建议从上篇看起。先大概回忆下,上一

 

代码实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值