ABP 源码解析 四. 启动配置
2018-08-17 本文已影响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();
在框架启动之初,初始化启动配置即可使用。
测试代码
测试类我的公众号