ABPABP

ABP 源码解析 四. 启动配置

2018-08-17  本文已影响4人  诸葛_小亮

介绍

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

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

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

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

参考文章:


UML

UML

源码解析

启动配置主要执行 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();

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


测试代码

测试类
我的公众号
上一篇 下一篇

猜你喜欢

热点阅读