Browse Source

Merge pull request #1430 from colinin/refactor-dynamic-initializer

refactor: Refactor dynamic initialization
dev
yx lin 3 days ago
committed by GitHub
parent
commit
5c395d32a6
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 48
      aspnet-core/modules/localization-management/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationDynamicInitializer.cs
  2. 4
      aspnet-core/modules/localization-management/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs
  3. 61
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationDynamicInitializer.cs
  4. 63
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateDynamicInitializer.cs
  5. 65
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain/LINGYUN/Abp/WebhooksManagement/WebhookDynamicInitializer.cs

48
aspnet-core/modules/localization-management/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationDynamicInitializer.cs

@ -16,64 +16,56 @@ public class LocalizationDynamicInitializer : ITransientDependency
public ILogger<LocalizationDynamicInitializer> Logger { get; set; }
protected IServiceProvider ServiceProvider { get; }
protected IOptions<AbpLocalizationManagementOptions> Options { get; }
protected IHostApplicationLifetime ApplicationLifetime { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected IStaticLocalizationSaver StaticLocalizationSaver { get; }
public LocalizationDynamicInitializer(
IServiceProvider serviceProvider,
IOptions<AbpLocalizationManagementOptions> options,
ICancellationTokenProvider cancellationTokenProvider,
IStaticLocalizationSaver staticLocalizationSaver)
public LocalizationDynamicInitializer(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
Options = options;
ApplicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
CancellationTokenProvider = cancellationTokenProvider;
StaticLocalizationSaver = staticLocalizationSaver;
Logger = NullLogger<LocalizationDynamicInitializer>.Instance;
}
public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default)
{
if (!Options.Value.SaveStaticLocalizationsToDatabase)
var options = ServiceProvider.GetRequiredService<IOptions<AbpLocalizationManagementOptions>>().Value;
if (!options.SaveStaticLocalizationsToDatabase)
{
return Task.CompletedTask;
}
if (runInBackground)
{
var applicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
Task.Run(async () =>
{
if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null)
if (cancellationToken == default && applicationLifetime?.ApplicationStopping != null)
{
cancellationToken = ApplicationLifetime.ApplicationStopping;
cancellationToken = applicationLifetime.ApplicationStopping;
}
await ExecuteInitializationAsync(cancellationToken);
await ExecuteInitializationAsync(options, cancellationToken);
}, cancellationToken);
return Task.CompletedTask;
}
return ExecuteInitializationAsync(cancellationToken);
return ExecuteInitializationAsync(options, cancellationToken);
}
protected virtual async Task ExecuteInitializationAsync(CancellationToken cancellationToken)
protected virtual async Task ExecuteInitializationAsync(AbpLocalizationManagementOptions options, CancellationToken cancellationToken)
{
try
{
using (CancellationTokenProvider.Use(cancellationToken))
var cancellationTokenProvider = ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
using (cancellationTokenProvider.Use(cancellationToken))
{
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticLocalizationToDatabaseAsync(cancellationToken);
await SaveStaticLocalizationToDatabaseAsync(options, cancellationToken);
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
@ -85,13 +77,15 @@ public class LocalizationDynamicInitializer : ITransientDependency
}
}
protected virtual async Task SaveStaticLocalizationToDatabaseAsync(CancellationToken cancellationToken)
protected virtual async Task SaveStaticLocalizationToDatabaseAsync(AbpLocalizationManagementOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.SaveStaticLocalizationsToDatabase)
if (!options.SaveStaticLocalizationsToDatabase)
{
return;
}
var staticLocalizationSaver = ServiceProvider.GetRequiredService<IStaticLocalizationSaver>();
await Policy
.Handle<Exception>(e => e is not OperationCanceledException)
.WaitAndRetryAsync(
@ -108,7 +102,7 @@ public class LocalizationDynamicInitializer : ITransientDependency
{
cancellationToken.ThrowIfCancellationRequested();
await StaticLocalizationSaver.SaveAsync();
await staticLocalizationSaver.SaveAsync();
}
catch (Exception ex)
{

4
aspnet-core/modules/localization-management/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs

@ -79,7 +79,9 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen
Logger.LogDebug("Waiting to acquire the distributed lock for saving static localizations...");
await using var applicationLockHandle = await DistributedLock.TryAcquireAsync(GetApplicationDistributedLockKey());
await using var applicationLockHandle = await DistributedLock.TryAcquireAsync(
GetApplicationDistributedLockKey(),
TimeSpan.FromSeconds(5));
if (applicationLockHandle == null)
{
return;

61
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationDynamicInitializer.cs

@ -15,71 +15,60 @@ public class NotificationDynamicInitializer : ITransientDependency
{
public ILogger<NotificationDynamicInitializer> Logger { get; set; }
protected IServiceProvider ServiceProvider { get; }
protected IOptions<AbpNotificationsManagementOptions> Options { get; }
protected IHostApplicationLifetime ApplicationLifetime { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected IDynamicNotificationDefinitionStore DynamicNotificationDefinitionStore { get; }
protected IStaticNotificationSaver StaticNotificationSaver { get; }
public NotificationDynamicInitializer(
IServiceProvider serviceProvider,
IOptions<AbpNotificationsManagementOptions> options,
ICancellationTokenProvider cancellationTokenProvider,
IDynamicNotificationDefinitionStore dynamicNotificationDefinitionStore,
IStaticNotificationSaver staticNotificationSaver)
public NotificationDynamicInitializer(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
Options = options;
CancellationTokenProvider = cancellationTokenProvider;
DynamicNotificationDefinitionStore = dynamicNotificationDefinitionStore;
StaticNotificationSaver = staticNotificationSaver;
ApplicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
Logger = NullLogger<NotificationDynamicInitializer>.Instance;
}
public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default)
{
if (!Options.Value.SaveStaticNotificationsToDatabase && !Options.Value.IsDynamicNotificationsStoreEnabled)
var options = ServiceProvider.GetRequiredService<IOptions<AbpNotificationsManagementOptions>>().Value;
if (!options.SaveStaticNotificationsToDatabase && !options.IsDynamicNotificationsStoreEnabled)
{
return Task.CompletedTask;
}
if (runInBackground)
{
var applicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
Task.Run(async () =>
{
if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null)
if (cancellationToken == default && applicationLifetime?.ApplicationStopping != null)
{
cancellationToken = ApplicationLifetime.ApplicationStopping;
cancellationToken = applicationLifetime.ApplicationStopping;
}
await ExecuteInitializationAsync(cancellationToken);
await ExecuteInitializationAsync(options, cancellationToken);
}, cancellationToken);
return Task.CompletedTask;
}
return ExecuteInitializationAsync(cancellationToken);
return ExecuteInitializationAsync(options, cancellationToken);
}
protected virtual async Task ExecuteInitializationAsync(CancellationToken cancellationToken)
protected virtual async Task ExecuteInitializationAsync(AbpNotificationsManagementOptions options, CancellationToken cancellationToken)
{
try
{
using (CancellationTokenProvider.Use(cancellationToken))
var cancellationTokenProvider = ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
using (cancellationTokenProvider.Use(cancellationToken))
{
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticNotificationssToDatabaseAsync(cancellationToken);
await SaveStaticNotificationssToDatabaseAsync(options, cancellationToken);
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await PreCacheDynamicNotificationsAsync(cancellationToken);
await PreCacheDynamicNotificationsAsync(options, cancellationToken);
}
}
catch
@ -88,13 +77,15 @@ public class NotificationDynamicInitializer : ITransientDependency
}
}
protected virtual async Task SaveStaticNotificationssToDatabaseAsync(CancellationToken cancellationToken)
protected virtual async Task SaveStaticNotificationssToDatabaseAsync(AbpNotificationsManagementOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.SaveStaticNotificationsToDatabase)
if (!options.SaveStaticNotificationsToDatabase)
{
return;
}
var staticNotificationSaver = ServiceProvider.GetRequiredService<IStaticNotificationSaver>();
await Policy
.Handle<Exception>(e => e is not OperationCanceledException)
.WaitAndRetryAsync(
@ -111,7 +102,7 @@ public class NotificationDynamicInitializer : ITransientDependency
{
cancellationToken.ThrowIfCancellationRequested();
await StaticNotificationSaver.SaveAsync();
await staticNotificationSaver.SaveAsync();
}
catch (Exception ex)
{
@ -122,18 +113,20 @@ public class NotificationDynamicInitializer : ITransientDependency
}, cancellationToken);
}
protected virtual async Task PreCacheDynamicNotificationsAsync(CancellationToken cancellationToken)
protected virtual async Task PreCacheDynamicNotificationsAsync(AbpNotificationsManagementOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.IsDynamicNotificationsStoreEnabled)
if (!options.IsDynamicNotificationsStoreEnabled)
{
return;
}
var dynamicNotificationDefinitionStore = ServiceProvider.GetRequiredService<IDynamicNotificationDefinitionStore>();
try
{
cancellationToken.ThrowIfCancellationRequested();
// Pre-cache notifications, so first request doesn't wait
await DynamicNotificationDefinitionStore.GetGroupsAsync();
await dynamicNotificationDefinitionStore.GetGroupsAsync();
}
catch (Exception ex)
{

63
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateDynamicInitializer.cs

@ -16,71 +16,60 @@ public class TextTemplateDynamicInitializer : ITransientDependency
public ILogger<TextTemplateDynamicInitializer> Logger { get; set; }
protected IServiceProvider ServiceProvider { get; }
protected IOptions<AbpTextTemplatingCachingOptions> Options { get; }
protected IHostApplicationLifetime ApplicationLifetime { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected ITemplateDefinitionStore TemplateDefinitionStore { get; }
protected IStaticTemplateSaver StaticTemplateSaver { get; }
public TextTemplateDynamicInitializer(
IServiceProvider serviceProvider,
IOptions<AbpTextTemplatingCachingOptions> options,
ICancellationTokenProvider cancellationTokenProvider,
ITemplateDefinitionStore templateDefinitionStore,
IStaticTemplateSaver staticTemplateSaver)
public TextTemplateDynamicInitializer(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
Options = options;
ApplicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
CancellationTokenProvider = cancellationTokenProvider;
TemplateDefinitionStore = templateDefinitionStore;
StaticTemplateSaver = staticTemplateSaver;
Logger = NullLogger<TextTemplateDynamicInitializer>.Instance;
}
public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default)
{
if (!Options.Value.SaveStaticTemplateDefinitionToDatabase && !Options.Value.IsDynamicTemplateDefinitionStoreEnabled)
var options = ServiceProvider.GetRequiredService<IOptions<AbpTextTemplatingCachingOptions>>().Value;
if (!options.SaveStaticTemplateDefinitionToDatabase && !options.IsDynamicTemplateDefinitionStoreEnabled)
{
return Task.CompletedTask;
}
if (runInBackground)
{
var applicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
Task.Run(async () =>
{
if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null)
if (cancellationToken == default && applicationLifetime?.ApplicationStopping != null)
{
cancellationToken = ApplicationLifetime.ApplicationStopping;
cancellationToken = applicationLifetime.ApplicationStopping;
}
await ExecuteInitializationAsync(cancellationToken);
await ExecuteInitializationAsync(options, cancellationToken);
}, cancellationToken);
return Task.CompletedTask;
}
return ExecuteInitializationAsync(cancellationToken);
return ExecuteInitializationAsync(options, cancellationToken);
}
protected virtual async Task ExecuteInitializationAsync(CancellationToken cancellationToken)
protected virtual async Task ExecuteInitializationAsync(AbpTextTemplatingCachingOptions options, CancellationToken cancellationToken)
{
try
{
using (CancellationTokenProvider.Use(cancellationToken))
var cancellationTokenProvider = ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
using (cancellationTokenProvider.Use(cancellationToken))
{
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticTextTemplatesToDatabaseAsync(cancellationToken);
await SaveStaticTextTemplatesToDatabaseAsync(options, cancellationToken);
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await PreCacheDynamicTextTemplatesAsync(cancellationToken);
await PreCacheDynamicTextTemplatesAsync(options, cancellationToken);
}
}
catch
@ -89,13 +78,15 @@ public class TextTemplateDynamicInitializer : ITransientDependency
}
}
protected virtual async Task SaveStaticTextTemplatesToDatabaseAsync(CancellationToken cancellationToken)
protected virtual async Task SaveStaticTextTemplatesToDatabaseAsync(AbpTextTemplatingCachingOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.SaveStaticTemplateDefinitionToDatabase)
if (!options.SaveStaticTemplateDefinitionToDatabase)
{
return;
}
var staticTemplateSaver = ServiceProvider.GetRequiredService<IStaticTemplateSaver>();
await Policy
.Handle<Exception>(e => e is not OperationCanceledException)
.WaitAndRetryAsync(
@ -112,8 +103,8 @@ public class TextTemplateDynamicInitializer : ITransientDependency
{
cancellationToken.ThrowIfCancellationRequested();
await StaticTemplateSaver.SaveDefinitionTemplateAsync();
await StaticTemplateSaver.SaveTemplateContentAsync();
await staticTemplateSaver.SaveDefinitionTemplateAsync();
await staticTemplateSaver.SaveTemplateContentAsync();
}
catch (Exception ex)
{
@ -124,19 +115,21 @@ public class TextTemplateDynamicInitializer : ITransientDependency
}, cancellationToken);
}
protected virtual async Task PreCacheDynamicTextTemplatesAsync(CancellationToken cancellationToken)
protected virtual async Task PreCacheDynamicTextTemplatesAsync(AbpTextTemplatingCachingOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.IsDynamicTemplateDefinitionStoreEnabled)
if (!options.IsDynamicTemplateDefinitionStoreEnabled)
{
return;
}
var templateDefinitionStore = ServiceProvider.GetRequiredService<ITemplateDefinitionStore>();
try
{
cancellationToken.ThrowIfCancellationRequested();
// Pre-cache tempte definitions, so first request doesn't wait
await TemplateDefinitionStore.GetAllAsync();
await templateDefinitionStore.GetAllAsync();
}
catch (Exception ex)
{

65
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain/LINGYUN/Abp/WebhooksManagement/WebhookDynamicInitializer.cs

@ -1,5 +1,4 @@
using JetBrains.Annotations;
using LINGYUN.Abp.Webhooks;
using LINGYUN.Abp.Webhooks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@ -18,72 +17,60 @@ public class WebhookDynamicInitializer : ITransientDependency
public ILogger<WebhookDynamicInitializer> Logger { get; set; }
protected IServiceProvider ServiceProvider { get; }
protected IOptions<WebhooksManagementOptions> Options { get; }
[CanBeNull]
protected IHostApplicationLifetime ApplicationLifetime { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected IDynamicWebhookDefinitionStore DynamicWebhookDefinitionStore { get; }
protected IStaticWebhookSaver StaticWebhookSaver { get; }
public WebhookDynamicInitializer(
IServiceProvider serviceProvider,
IOptions<WebhooksManagementOptions> options,
ICancellationTokenProvider cancellationTokenProvider,
IDynamicWebhookDefinitionStore dynamicWebhookDefinitionStore,
IStaticWebhookSaver staticWebhookSaver)
public WebhookDynamicInitializer(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
Options = options;
ApplicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
CancellationTokenProvider = cancellationTokenProvider;
DynamicWebhookDefinitionStore = dynamicWebhookDefinitionStore;
StaticWebhookSaver = staticWebhookSaver;
Logger = NullLogger<WebhookDynamicInitializer>.Instance;
}
public virtual Task InitializeAsync(bool runInBackground, CancellationToken cancellationToken = default)
{
if (!Options.Value.SaveStaticWebhooksToDatabase && !Options.Value.IsDynamicWebhookStoreEnabled)
var options = ServiceProvider.GetRequiredService<IOptions<WebhooksManagementOptions>>().Value;
if (!options.SaveStaticWebhooksToDatabase && !options.IsDynamicWebhookStoreEnabled)
{
return Task.CompletedTask;
}
if (runInBackground)
{
var applicationLifetime = ServiceProvider.GetService<IHostApplicationLifetime>();
Task.Run(async () =>
{
if (cancellationToken == default && ApplicationLifetime?.ApplicationStopping != null)
if (cancellationToken == default && applicationLifetime?.ApplicationStopping != null)
{
cancellationToken = ApplicationLifetime.ApplicationStopping;
cancellationToken = applicationLifetime.ApplicationStopping;
}
await ExecuteInitializationAsync(cancellationToken);
await ExecuteInitializationAsync(options, cancellationToken);
}, cancellationToken);
return Task.CompletedTask;
}
return ExecuteInitializationAsync(cancellationToken);
return ExecuteInitializationAsync(options, cancellationToken);
}
protected virtual async Task ExecuteInitializationAsync(CancellationToken cancellationToken)
protected virtual async Task ExecuteInitializationAsync(WebhooksManagementOptions options, CancellationToken cancellationToken)
{
try
{
using (CancellationTokenProvider.Use(cancellationToken))
var cancellationTokenProvider = ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
using (cancellationTokenProvider.Use(cancellationToken))
{
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticWebhooksToDatabaseAsync(cancellationToken);
await SaveStaticWebhooksToDatabaseAsync(options, cancellationToken);
if (CancellationTokenProvider.Token.IsCancellationRequested)
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await PreCacheDynamicWebhooksAsync(cancellationToken);
await PreCacheDynamicWebhooksAsync(options, cancellationToken);
}
}
catch
@ -92,13 +79,15 @@ public class WebhookDynamicInitializer : ITransientDependency
}
}
protected virtual async Task SaveStaticWebhooksToDatabaseAsync(CancellationToken cancellationToken)
protected virtual async Task SaveStaticWebhooksToDatabaseAsync(WebhooksManagementOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.SaveStaticWebhooksToDatabase)
if (!options.SaveStaticWebhooksToDatabase)
{
return;
}
var staticWebhookSaver = ServiceProvider.GetRequiredService<IStaticWebhookSaver>();
await Policy
.Handle<Exception>(e => e is not OperationCanceledException)
.WaitAndRetryAsync(
@ -115,7 +104,7 @@ public class WebhookDynamicInitializer : ITransientDependency
{
cancellationToken.ThrowIfCancellationRequested();
await StaticWebhookSaver.SaveAsync();
await staticWebhookSaver.SaveAsync();
}
catch (Exception ex)
{
@ -126,19 +115,21 @@ public class WebhookDynamicInitializer : ITransientDependency
}, cancellationToken);
}
protected virtual async Task PreCacheDynamicWebhooksAsync(CancellationToken cancellationToken)
protected virtual async Task PreCacheDynamicWebhooksAsync(WebhooksManagementOptions options, CancellationToken cancellationToken)
{
if (!Options.Value.IsDynamicWebhookStoreEnabled)
if (!options.IsDynamicWebhookStoreEnabled)
{
return;
}
var dynamicWebhookDefinitionStore = ServiceProvider.GetRequiredService<IDynamicWebhookDefinitionStore>();
try
{
cancellationToken.ThrowIfCancellationRequested();
// Pre-cache webhoks, so first request doesn't wait
await DynamicWebhookDefinitionStore.GetGroupsAsync();
await dynamicWebhookDefinitionStore.GetGroupsAsync();
}
catch (Exception ex)
{

Loading…
Cancel
Save