ABP模块运行解析

从官方创建一份ASP.NET CORE 2.0的项目,并加入源码调试,可以看出如下图的加载顺序

 

1.ABP是通过什么样的机制加载的

既然ABP中模块需要添加DLL到引用中,又要加入DependsOn在类前面,前者已经在程序集中加入了,后天是做的什么工作?

现有Module A依赖Module B

 

假设Module B 和Module A都是静态类,可能就不需要进行物理关联了,DependsOn也是没有什么用的。

通过分析源码可以看出,整个ABP实际就是对依赖注册和控制反转的管理。ABP Modules也不例外。

 2.ABP的模块如何调用依赖模块中的其他类,例如

例如ModuleB有IUserService和IRoleService,那么我们如何调用他呢。

在IOC架构的系统中,万年不变的顺序就是

(1)找到相关类,并通过Ioc注册

(2)使用的时候通过控制反转,依赖注入即可

在ABP中,模块的加载,只负责各个模块的加载、释放。不负责具体模块内的类注册。

在ABP中,各个模块中需要注册使用的类通过PreInitialize方法进行自行管理。

例如 Abp.AutoMapper中的AbpAutoMapperModule

public override void PreInitialize()
        {
            IocManager.Register<IAbpAutoMapperConfiguration, AbpAutoMapperConfiguration>();

            Configuration.ReplaceService<ObjectMapping.IObjectMapper, AutoMapperObjectMapper>();

            Configuration.Modules.AbpAutoMapper().Configurators.Add(CreateCoreMappings);
        }

3.系统核心的类是通过什么方式注入的

ABP系统核心的类注册都放到了Abp.Dependency.Installers 下的AbpCoreInstaller.cs文件中

通过AbpBootstrapper.Initialize 来注册 IocManager.IocContainer.Install(new AbpCoreInstaller());

 /// <summary>
        /// Initializes the ABP system.
        /// 初始化ABP系统
        /// </summary>
        public virtual void Initialize()
        {
            //获取日志
            ResolveLogger();

            try
            {
                //获取启动类
                RegisterBootstrapper();
                //注册基础的类
                IocManager.IocContainer.Install(new AbpCoreInstaller());
                //获取插件 添加PlugInSources
                IocManager.Resolve<AbpPlugInManager>().PlugInSources.AddRange(PlugInSources);
                //获取AbpStartupConfiguration 并初始化
                IocManager.Resolve<AbpStartupConfiguration>().Initialize();
                //使用Abp模块管理器
                _moduleManager = IocManager.Resolve<AbpModuleManager>();
                //初始化模块
                _moduleManager.Initialize(StartupModule);
                //启动模块
                _moduleManager.StartModules();
            }
            catch (Exception ex)
            {
                _logger.Fatal(ex.ToString(), ex);
                throw;
            }
        }

 4.ABP是否支持插件式方式加载

官方目前所有的实例,都是通过引用加载DLL来实现依赖。实际上ABP是支持Plugins方式指定目录存放DLL文件的。

这也不难理解,既然ABP的Module工作方式,是独立的,那么DLL程序集存放在哪里都是一样的。

在官方给出的文档 已有说明 https://aspnetboilerplate.com/Pages/Documents/Module-System

我们可以通过AddAbp服务实现

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.Add(new FolderPlugInSource(@"C:\MyPlugIns"));
});

 5.了解了ABP的模块工作方式,我们就可以依葫芦画瓢,实现相同的工作原理。

实际上我再关注另一个框架 http://www.zkweb.org/ 其模块依赖的原理是跟ABP一样的,实现方法不一样而已。

 

posted @ 2017-09-24 11:16  fishpro  阅读(1698)  评论(0编辑  收藏