美文网首页ABPABP
ABP 源码解析 四. 启动配置

ABP 源码解析 四. 启动配置

作者: 诸葛_小亮 | 来源:发表于2018-08-17 21:28 被阅读4次

    介绍

    此系列文章主要是对ABP源码进行解读,初探作者在创造ABP的框架思路,和使用到的设计模式进行。
    通过解读ABP源码,可以提升ABP使用方式,可以提升编码意识,提高面向对象编程思想。

    《ABP 源码解析 三. 模块化》中介绍了ABP的模块化系统。

    本篇文章主要介绍ABP中启动配置。

    ABP提供了启动时配置其模块的功能,配置是在模块中的PreInitialize方法内执行。

    参考文章:


    UML

    UML
    • AbpStartupConfiguration:用于在启动时配置ABP模块,该类中包括abp系统中的基础配置,比如:缓存、审计日志、后台工作、数据库链接字符串、通知、导航 等等,该类亦提供了替换ioc组件的方法ReplaceService

    源码解析

    启动配置主要执行 AbpStartupConfiguration中的Initialize方法

     /// <summary>
        /// This class is used to configure ABP and modules on startup.
        /// 此类用于在启动时配置ABP模块
        /// </summary>
        internal class AbpStartupConfiguration : DictionaryBasedConfig, IAbpStartupConfiguration
        {
            /// <summary>
            /// Reference to the IocManager.
            /// ioc管理器
            /// </summary>
            public IIocManager IocManager { get; }
    
            /// <summary>
            /// Used to set localization configuration.
            /// 设置本地化配置
            /// </summary>
            public ILocalizationConfiguration Localization { get; private set; }
    
            /// <summary>
            /// Used to configure authorization.
            /// 配置授权
            /// </summary>
            public IAuthorizationConfiguration Authorization { get; private set; }
    
            /// <summary>
            /// Used to configure validation.
            /// 配置验证
            /// </summary>
            public IValidationConfiguration Validation { get; private set; }
    
            /// <summary>
            /// Used to configure settings.
            /// 配置设置
            /// </summary>
            public ISettingsConfiguration Settings { get; private set; }
    
            /// <summary>
            /// Gets/sets default connection string used by ORM module.
            /// It can be name of a connection string in application's config file or can be full connection string.
            /// ORM模块使用的默认连接字符串
            /// 它可以是应用程序配置文件中连接字符串的名称,也可以是完整的连接字符串
            /// </summary>
            public string DefaultNameOrConnectionString { get; set; }
    
            /// <summary>
            /// Used to configure modules.
            /// Modules can write extension methods to <see cref="ModuleConfigurations"/> to add module specific configurations.
            /// 用于配置模块
            /// 模块可以编写扩展方法来<see cref = "ModuleConfigurations" />添加模块特定的配置
            /// </summary>
            public IModuleConfigurations Modules { get; private set; }
    
            /// <summary>
            /// Used to configure unit of work defaults.
            /// 用于配置工作单位默认值
            /// </summary>
            public IUnitOfWorkDefaultOptions UnitOfWork { get; private set; }
    
            /// <summary>
            /// Used to configure features.
            /// 用于配置功能
            /// </summary>
            public IFeatureConfiguration Features { get; private set; }
    
            /// <summary>
            /// Used to configure background job system.
            /// 用于配置后台作业系统
            /// </summary>
            public IBackgroundJobConfiguration BackgroundJobs { get; private set; }
    
            /// <summary>
            /// Used to configure notification system.
            /// 用于配置通知系统
            /// </summary>
            public INotificationConfiguration Notifications { get; private set; }
    
            /// <summary>
            /// Used to configure navigation.
            /// 用于配置导航
            /// </summary>
            public INavigationConfiguration Navigation { get; private set; }
    
            /// <summary>
            /// Used to configure <see cref="IEventBus"/>.
            /// 用于配置<see cref="IEventBus"/>
            /// </summary>
            public IEventBusConfiguration EventBus { get; private set; }
    
            /// <summary>
            /// Used to configure auditing.
            /// 用于配置审核日志
            /// </summary>
            public IAuditingConfiguration Auditing { get; private set; }
    
            /// <summary>
            /// 用于配置缓存
            /// </summary>
            public ICachingConfiguration Caching { get; private set; }
    
            /// <summary>
            /// Used to configure multi-tenancy.
            /// 用于配置多租户
            /// </summary>
            public IMultiTenancyConfig MultiTenancy { get; private set; }
    
            public Dictionary<Type, Action> ServiceReplaceActions { get; private set; }
    
            /// <summary>
            /// 配置内嵌资源
            /// </summary>
            public IEmbeddedResourcesConfiguration EmbeddedResources { get; private set; }
    
            /// <summary>
            /// 配置实体历史
            /// </summary>
            public IEntityHistoryConfiguration EntityHistory { get; private set; }
    
            /// <summary>
            /// 自动以配置提供者
            /// </summary>
            public IList<ICustomConfigProvider> CustomConfigProviders { get; private set; }
    
            /// <summary>
            /// 获取自定义配置
            /// </summary>
            /// <returns></returns>
            public Dictionary<string, object> GetCustomConfig()
            {
                var mergedConfig = new Dictionary<string, object>();
    
                using (var scope = IocManager.CreateScope())
                {
                    foreach (var provider in CustomConfigProviders)
                    {
                        var config = provider.GetConfig(new CustomConfigProviderContext(scope));
                        foreach (var keyValue in config)
                        {
                            mergedConfig[keyValue.Key] = keyValue.Value;
                        }
                    }
                }
    
                return mergedConfig;
            }
    
            /// <summary>
            /// Private constructor for singleton pattern.
            /// 初始化<see cref="AbpStartupConfiguration"/> 实例
            /// </summary>
            public AbpStartupConfiguration(IIocManager iocManager)
            {
                IocManager = iocManager;
            }
    
            /// <summary>
            /// 初始化配置
            /// </summary>
            public void Initialize()
            {
                Localization = IocManager.Resolve<ILocalizationConfiguration>();
                Modules = IocManager.Resolve<IModuleConfigurations>();
                Features = IocManager.Resolve<IFeatureConfiguration>();
                Navigation = IocManager.Resolve<INavigationConfiguration>();
                Authorization = IocManager.Resolve<IAuthorizationConfiguration>();
                Validation = IocManager.Resolve<IValidationConfiguration>();
                Settings = IocManager.Resolve<ISettingsConfiguration>();
                UnitOfWork = IocManager.Resolve<IUnitOfWorkDefaultOptions>();
                EventBus = IocManager.Resolve<IEventBusConfiguration>();
                MultiTenancy = IocManager.Resolve<IMultiTenancyConfig>();
                Auditing = IocManager.Resolve<IAuditingConfiguration>();
                Caching = IocManager.Resolve<ICachingConfiguration>();
                BackgroundJobs = IocManager.Resolve<IBackgroundJobConfiguration>();
                Notifications = IocManager.Resolve<INotificationConfiguration>();
                EmbeddedResources = IocManager.Resolve<IEmbeddedResourcesConfiguration>();
                EntityHistory = IocManager.Resolve<IEntityHistoryConfiguration>();
    
                CustomConfigProviders = new List<ICustomConfigProvider>();
                ServiceReplaceActions = new Dictionary<Type, Action>();
            }
    
            /// <summary>
            /// 替换服务
            /// </summary>
            /// <param name="type"></param>
            /// <param name="replaceAction"></param>
            public void ReplaceService(Type type, Action replaceAction)
            {
                ServiceReplaceActions[type] = replaceAction;
            }
    
            public T Get<T>()
            {
                return GetOrCreate(typeof(T).FullName, () => IocManager.Resolve<T>());
            }
        }
    

    AbpBootstrapper中执行的方法如下

    
                    // 初始化启动配置
                    IocManager.Resolve<AbpStartupConfiguration>().Initialize();
    
    

    在框架启动之初,初始化启动配置即可使用。


    测试代码

    测试类
    我的公众号

    相关文章

      网友评论

        本文标题:ABP 源码解析 四. 启动配置

        本文链接:https://www.haomeiwen.com/subject/wdxvvftx.html