ABP模块化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABP模块化相关的知识,希望对你有一定的参考价值。

 基于ABP的模块化、插件化设计,Abp底层框架提供便捷的方法集成每个Module,开发人员可以将自定义的功能以模块的形式集成到ABP中。

模块的加载

模块:

技术分享

插件:

技术分享

Configuration:

技术分享

 

模块及插件的加载路线:

 1. 扩展的HttpApplication对象(在Abp.Web项目中AbpWebApplication<TStartupModule> : HttpApplication)中有AbpBootstrapper成员

AbpWebApplication的Application_Start方法:

protected virtual void Application_Start(object sender, EventArgs e)
{
    ThreadCultureSanitizer.Sanitize();

    AbpBootstrapper.Initialize();

    _webLocalizationConfiguration = AbpBootstrapper.IocManager.Resolve<IAbpWebLocalizationConfiguration>();
}

 项目的Global文件中

public class MvcApplication : AbpWebApplication<HKWEBWebModule>
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(
            f => f.UseAbpLog4Net().WithConfig("log4net.config")
        );
        //添加插件
        AbpBootstrapper.PlugInSources.AddFolder(@"C:\\MyPlugIns");
        AbpBootstrapper.PlugInSources.AddTypeList(typeof(MyPlugInModule));
        base.Application_Start(sender, e);
    }
}

 AbpBootstrapper的Initialize方法

public virtual void Initialize()
{
    //实例化_logger
    ResolveLogger();

    try
    {
        //把Bootstrapper类自身加到容器里
        RegisterBootstrapper();
        IocManager.IocContainer.Install(new CoreInstaller());

        //将附加的插件加入队列
        IocManager.Resolve<PlugInManager>().PlugInSources.AddRange(PlugInSources);

        //StartupConfiguration.Modules,Settings,ServiceReplaceActions等核心配置
        IocManager.Resolve<StartupConfiguration>().Initialize();

        _moduleManager = IocManager.Resolve<ModuleManager>();
        //加载所有Module
        _moduleManager.Initialize(StartupModule);
        //对这些Module排序,之后依次执行所有模块的PreInitialize,Initialize,PostInitialize
        _moduleManager.StartModules();        
    }
    catch (Exception ex)
    {
        _logger.Fatal(ex.ToString(), ex);
        throw;
    }
}

 

模块管理器的初始化操作会加载所有依赖的模块,并通过模块类型上的Dependon属性确定它们的注册顺序,同时也会加载AbpBootstrapper.PlugInSources中添加的插件,插件的添加 目前提供了两种实现。

AbpBootstrapper的Dispose方法,倒序释放各模块中加载的资源

public virtual void Dispose()
{
    if (IsDisposed)
    {
        return;
    }

    IsDisposed = true;

    //倒序执行所有模块的Shutdown方法
    _moduleManager?.ShutdownModules();
}

模块的扩展

以Abp.Web模块为例,每个自定义模块都会提供一个由AbpModule衍生的类型,模块管理器就是遍历所有被应用的程序集,从中找到每一个包含AbpModule类型的视为一个个模块。然后在依据DependsOn对这些Module排序,之后依次执行所有模块的PreInitialize,Initialize,PostInitialize(3个foreach)。

[DependsOn(typeof(AbpWebCommonModule))]    
public class AbpWebModule : AbpModule
{
    /// <inheritdoc/>
    public override void PreInitialize()
    {
        IocManager.Register<IAbpAntiForgeryWebConfiguration, AbpAntiForgeryWebConfiguration>();
        IocManager.Register<IAbpWebLocalizationConfiguration, AbpWebLocalizationConfiguration>();
        IocManager.Register<IAbpWebModuleConfiguration, AbpWebModuleConfiguration>();
        
        Configuration.ReplaceService<IPrincipalAccessor, HttpContextPrincipalAccessor>(DependencyLifeStyle.Transient);
        Configuration.ReplaceService<IClientInfoProvider, WebAuditInfoProvider>(DependencyLifeStyle.Transient);

        AddIgnoredTypes();
    }

    /// <inheritdoc/>
    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());            
    }
	
	//……
}

 一个扩展方法用于添加配置信息,configurations.AbpConfiguration就是IAbpStartupConfiguration

public static class AbpWebConfigurationExtensions
{
    /// <summary>
    /// Used to configure ABP Web module.
    /// </summary>
    public static IAbpWebModuleConfiguration AbpWeb(this IModuleConfigurations configurations)
    {
        return configurations.AbpConfiguration.Get<IAbpWebModuleConfiguration>();
    }
}

  

internal class AbpStartupConfiguration : DictionaryBasedConfig, IAbpStartupConfiguration
{
    /// <summary>
    /// Reference to the IocManager.
    /// </summary>
    public IIocManager IocManager { get; }

    /// <summary>
    /// Used to configure modules.
    /// Modules can write extension methods to <see cref="ModuleConfigurations"/> to add module specific configurations.
    /// </summary>
    public IModuleConfigurations Modules { get; private set; }

    public T Get<T>()
    {
        return GetOrCreate(typeof(T).FullName, () => IocManager.Resolve<T>());
    }
	
	//……
}

  

public class DictionaryBasedConfig : IDictionaryBasedConfig
{
    /// <summary>
    /// Dictionary of custom configuration.
    /// </summary>
    protected Dictionary<string, object> CustomSettings { get; private set; }

    /// <summary>
    /// Gets a configuration object with given name.
    /// </summary>
    public T GetOrCreate<T>(string name, Func<T> creator)
    {
        var value = Get(name);
        if (value == null)
        {
            value = creator();
            Set(name, value);
        }
        return (T) value;
    }
	
	//……
}

  

 

 

 

以上是关于ABP模块化的主要内容,如果未能解决你的问题,请参考以下文章

ABP系统设置

ABP中的模块初始化过程

ABP中模块初始化过程

ABP模块化

ABP模块化

ABP模块配置