翼度科技»论坛 编程开发 .net 查看内容

Abp vNext 模块加载机制

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
文章目录
生命周期


  • PreConfigureServices  添加依赖注入或者其它配置之前
  • ConfigureServices 添加依赖注入或者其它配置
  • PostConfigureServices 添加依赖注入或者其它配置之后
  • OnPreApplicationInitialization 初始化所有模块之前
  • OnApplicationInitialization 初始化所有模块
  • OnPostApplicationInitialization 初始化所有模块之后
  • OnApplicationShutdown 应用关闭执行
OnPreApplicationInitializationOnPostApplicationInitialization方法用来在OnApplicationInitialization之前或之后覆盖和编写你的代码.请注意,在这些方法中编写的代码将在所有其他模块的OnApplicationInitialization方法之前/之后执行.
加载流程


  • 进入到Startup
  1. public class Startup
  2. {
  3.     public void ConfigureServices(IServiceCollection services)
  4.     {
  5.         services.AddApplication<xxxManagementHttpApiHostModule>();
  6.     }
  7. }
复制代码

  • 查看AddApplication源码会调用AbpApplicationFactory.CreateAsync
  1. public async static Task<IAbpApplicationWithExternalServiceProvider> CreateAsync(
  2.     [NotNull] Type startupModuleType,
  3.     [NotNull] IServiceCollection services,
  4.     Action<AbpApplicationCreationOptions>? optionsAction = null)
  5. {
  6.     var app = new AbpApplicationWithExternalServiceProvider(startupModuleType, services, options =>
  7.     {
  8.         options.SkipConfigureServices = true;
  9.         optionsAction?.Invoke(options);
  10.     });
  11.     await app.ConfigureServicesAsync();
  12.     return app;
  13. }
复制代码

  • 进入AbpApplicationWithExternalServiceProvider,我们可以看到继承AbpApplicationBase
  1. internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, IAbpApplicationWithExternalServiceProvider
  2. {
  3.     public AbpApplicationWithExternalServiceProvider(
  4.         [NotNull] Type startupModuleType,
  5.         [NotNull] IServiceCollection services,
  6.         Action<AbpApplicationCreationOptions>? optionsAction
  7.         ) : base(
  8.             startupModuleType,
  9.             services,
  10.             optionsAction)
  11.     {
  12.         services.AddSingleton<IAbpApplicationWithExternalServiceProvider>(this);
  13.     }
  14.     void IAbpApplicationWithExternalServiceProvider.SetServiceProvider([NotNull] IServiceProvider serviceProvider)
  15.     {
  16.         Check.NotNull(serviceProvider, nameof(serviceProvider));
  17.         // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
  18.         if (ServiceProvider != null)
  19.         {
  20.             if (ServiceProvider != serviceProvider)
  21.             {
  22.                 throw new AbpException("Service provider was already set before to another service provider instance.");
  23.             }
  24.             return;
  25.         }
  26.         SetServiceProvider(serviceProvider);
  27.     }
复制代码

  • 查看AbpApplicationBase构造函数
  1. internal AbpApplicationBase(
  2.         [NotNull] Type startupModuleType,
  3.         [NotNull] IServiceCollection services,
  4.         Action<AbpApplicationCreationOptions>? optionsAction)
  5.     {
  6.         services.AddCoreServices();
  7.         services.AddCoreAbpServices(this, options);
  8.         // 加载模块
  9.         Modules = LoadModules(services, options);
  10.     }
复制代码

  • 查看加载模块逻辑
  1. public IAbpModuleDescriptor[] LoadModules(
  2.     IServiceCollection services,
  3.     Type startupModuleType,
  4.     PlugInSourceList plugInSources)
  5. {
  6.     Check.NotNull(services, nameof(services));
  7.     Check.NotNull(startupModuleType, nameof(startupModuleType));
  8.     Check.NotNull(plugInSources, nameof(plugInSources));
  9.     // 扫描模块
  10.     var modules = GetDescriptors(services, startupModuleType, plugInSources);
  11.     // 按照模块的依赖性重新排序
  12.     modules = SortByDependency(modules, startupModuleType);
  13.     return modules.ToArray();
  14. }
复制代码
生命周期

在上面第二步我们可以看到有一个await app.ConfigureServicesAsync();

  • 在这个方法中可以看到依次执行每个模块的PreConfigureServices,ConfigureServices,PostConfigureServices
  1. public virtual async Task ConfigureServicesAsync()
  2.     {
  3.         CheckMultipleConfigureServices();
  4.         var context = new ServiceConfigurationContext(Services);
  5.         Services.AddSingleton(context);
  6.         foreach (var module in Modules)
  7.         {
  8.             if (module.Instance is AbpModule abpModule)
  9.             {
  10.                 abpModule.ServiceConfigurationContext = context;
  11.             }
  12.         }
  13.         //PreConfigureServices
  14.         foreach (var module in Modules.Where(m => m.Instance is IPreConfigureServices))
  15.         {
  16.             try
  17.             {
  18.                 await ((IPreConfigureServices)module.Instance).PreConfigureServicesAsync(context);
  19.             }
  20.             catch (Exception ex)
  21.             {
  22.                 throw new AbpInitializationException($"An error occurred during {nameof(IPreConfigureServices.PreConfigureServicesAsync)} phase of the module {module.Type.AssemblyQualifiedName}. See the inner exception for details.", ex);
  23.             }
  24.         }
  25.         var assemblies = new HashSet<Assembly>();
  26.         //ConfigureServices
  27.         foreach (var module in Modules)
  28.         {
  29.             if (module.Instance is AbpModule abpModule)
  30.             {
  31.                 if (!abpModule.SkipAutoServiceRegistration)
  32.                 {
  33.                     var assembly = module.Type.Assembly;
  34.                     if (!assemblies.Contains(assembly))
  35.                     {
  36.                         Services.AddAssembly(assembly);
  37.                         assemblies.Add(assembly);
  38.                     }
  39.                 }
  40.             }
  41.             try
  42.             {
  43.                 await module.Instance.ConfigureServicesAsync(context);
  44.             }
  45.             catch (Exception ex)
  46.             {
  47.                 throw new AbpInitializationException($"An error occurred during {nameof(IAbpModule.ConfigureServicesAsync)} phase of the module {module.Type.AssemblyQualifiedName}. See the inner exception for details.", ex);
  48.             }
  49.         }
  50.         //PostConfigureServices
  51.         foreach (var module in Modules.Where(m => m.Instance is IPostConfigureServices))
  52.         {
  53.             try
  54.             {
  55.                 await ((IPostConfigureServices)module.Instance).PostConfigureServicesAsync(context);
  56.             }
  57.             catch (Exception ex)
  58.             {
  59.                 throw new AbpInitializationException($"An error occurred during {nameof(IPostConfigureServices.PostConfigureServicesAsync)} phase of the module {module.Type.AssemblyQualifiedName}. See the inner exception for details.", ex);
  60.             }
  61.         }
  62.         foreach (var module in Modules)
  63.         {
  64.             if (module.Instance is AbpModule abpModule)
  65.             {
  66.                 abpModule.ServiceConfigurationContext = null!;
  67.             }
  68.         }
  69.         _configuredServices = true;
  70.     }
复制代码

  • 再次查看第四步中有一个services.AddCoreAbpServices(this, options);
    这个里面构造好其它的四个生命周期
  1. internal static void AddCoreAbpServices(this IServiceCollection services,
  2.     IAbpApplication abpApplication,
  3.     AbpApplicationCreationOptions applicationCreationOptions)
  4. {
  5.     var moduleLoader = new ModuleLoader();
  6.     var assemblyFinder = new AssemblyFinder(abpApplication);
  7.     var typeFinder = new TypeFinder(assemblyFinder);
  8.     if (!services.IsAdded<IConfiguration>())
  9.     {
  10.         services.ReplaceConfiguration(
  11.             ConfigurationHelper.BuildConfiguration(
  12.                 applicationCreationOptions.Configuration
  13.             )
  14.         );
  15.     }
  16.     services.TryAddSingleton<IModuleLoader>(moduleLoader);
  17.     services.TryAddSingleton<IAssemblyFinder>(assemblyFinder);
  18.     services.TryAddSingleton<ITypeFinder>(typeFinder);
  19.     services.TryAddSingleton<IInitLoggerFactory>(new DefaultInitLoggerFactory());
  20.     services.AddAssemblyOf<IAbpApplication>();
  21.     services.AddTransient(typeof(ISimpleStateCheckerManager<>), typeof(SimpleStateCheckerManager<>));
  22.     // 注册生命周期
  23.     services.Configure<AbpModuleLifecycleOptions>(options =>
  24.     {
  25.         // OnPreApplicationInitialization
  26.         options.Contributors.Add<OnPreApplicationInitializationModuleLifecycleContributor>();
  27.         // OnApplicationInitialization
  28.         options.Contributors.Add<OnApplicationInitializationModuleLifecycleContributor>();
  29.         // OnPostApplicationInitialization
  30.         options.Contributors.Add<OnPostApplicationInitializationModuleLifecycleContributor>();
  31.         // OnApplicationShutdown
  32.         options.Contributors.Add<OnApplicationShutdownModuleLifecycleContributor>();
  33.     });
  34. }
复制代码
注册了这四个生命周期,在什么时候调用呢?请继续往下看。

  • 继续回到Startup类
  1. public class Startup
  2. {
  3.     public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
  4.     {
  5.         app.InitializeApplication();
  6.     }
  7. }
复制代码

  • 查看InitializeApplication


  • 遍历刚刚注入的四个生命周期,执行Initialize初始化方法
  1. public void InitializeModules(ApplicationInitializationContext context)
  2. {
  3.     foreach (var contributor in _lifecycleContributors)
  4.     {
  5.         foreach (var module in _moduleContainer.Modules)
  6.         {
  7.             try
  8.             {
  9.                 contributor.Initialize(context, module.Instance);
  10.             }
  11.             catch (Exception ex)
  12.             {
  13.                 //
  14.             }
  15.         }
  16.     }
  17.     _logger.LogInformation("Initialized all ABP modules.");
  18. }
复制代码
Abp vNext Pro

如果觉得可以,不要吝啬你的小星星哦

文章目录

来源:https://www.cnblogs.com/WangJunZzz/archive/2023/09/25/17728392.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具