diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs index 72ce661ed5..278814780d 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs @@ -43,6 +43,12 @@ public static class ServiceCollectionApplicationExtensions [CanBeNull] public static string GetApplicationName(this IServiceCollection services) { - return services.GetSingletonInstance().ApplicationName; + return services.GetSingletonInstance().ApplicationName; + } + + [NotNull] + public static string GetApplicationInstanceId(this IServiceCollection services) + { + return services.GetSingletonInstance().InstanceId; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index 74f263198b..fd91b09982 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -26,6 +26,8 @@ public abstract class AbpApplicationBase : IAbpApplication public string ApplicationName { get; } + public string InstanceId { get; } = Guid.NewGuid().ToString(); + private bool _configuredServices; internal AbpApplicationBase( @@ -47,7 +49,7 @@ public abstract class AbpApplicationBase : IAbpApplication ApplicationName = GetApplicationName(options); services.AddSingleton(this); - services.AddSingleton(this); + services.AddSingleton(this); services.AddSingleton(this); services.AddCoreServices(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs index 35542ee91f..9543e18bd3 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs @@ -7,7 +7,7 @@ namespace Volo.Abp; public interface IAbpApplication : IModuleContainer, - IApplicationNameAccessor, + IApplicationInfoAccessor, IDisposable { /// diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs similarity index 54% rename from framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs rename to framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs index e814a0c317..01d20cfbc7 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs @@ -2,7 +2,7 @@ using JetBrains.Annotations; namespace Volo.Abp; -public interface IApplicationNameAccessor +public interface IApplicationInfoAccessor { /// /// Name of the application. @@ -11,4 +11,11 @@ public interface IApplicationNameAccessor /// [CanBeNull] string ApplicationName { get; } + + /// + /// A unique identifier for this application instance. + /// This value changes whenever the application is restarted. + /// + [NotNull] + string InstanceId { get; } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs index 0123bf1d0d..cf54b1492a 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs @@ -151,7 +151,7 @@ public class AbpApplication_Initialize_Tests } [Fact] - public void Should_Set_And_Get_ApplicationName() + public void Should_Set_And_Get_ApplicationName_And_InstanceId() { var applicationName = "MyApplication"; @@ -165,10 +165,9 @@ public class AbpApplication_Initialize_Tests application.Initialize(); - application.ServiceProvider - .GetRequiredService() - .ApplicationName - .ShouldBe(applicationName); + var appInfo = application.ServiceProvider.GetRequiredService(); + appInfo.ApplicationName.ShouldBe(applicationName); + appInfo.InstanceId.ShouldNotBeNullOrEmpty(); } using (var application = AbpApplicationFactory.Create(options => @@ -185,7 +184,7 @@ public class AbpApplication_Initialize_Tests application.Initialize(); application.ServiceProvider - .GetRequiredService() + .GetRequiredService() .ApplicationName .ShouldBe(applicationName); } @@ -199,7 +198,7 @@ public class AbpApplication_Initialize_Tests application.Initialize(); application.ServiceProvider - .GetRequiredService() + .GetRequiredService() .ApplicationName .ShouldBe(applicationName); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureSaver.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureSaver.cs index 8786f9ddb6..5b3e581518 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureSaver.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureSaver.cs @@ -22,7 +22,7 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency protected IFeatureDefinitionRecordRepository FeatureRepository { get; } protected IFeatureDefinitionSerializer FeatureSerializer { get; } protected IDistributedCache Cache { get; } - protected IApplicationNameAccessor ApplicationNameAccessor { get; } + protected IApplicationInfoAccessor ApplicationInfoAccessor { get; } protected IAbpDistributedLock DistributedLock { get; } protected AbpFeatureOptions FeatureOptions { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } @@ -35,7 +35,7 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency IFeatureDefinitionSerializer featureSerializer, IDistributedCache cache, IOptions cacheOptions, - IApplicationNameAccessor applicationNameAccessor, + IApplicationInfoAccessor applicationInfoAccessor, IAbpDistributedLock distributedLock, IOptions featureManagementOptions, ICancellationTokenProvider cancellationTokenProvider) @@ -45,7 +45,7 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency FeatureRepository = featureRepository; FeatureSerializer = featureSerializer; Cache = cache; - ApplicationNameAccessor = applicationNameAccessor; + ApplicationInfoAccessor = applicationInfoAccessor; DistributedLock = distributedLock; CancellationTokenProvider = cancellationTokenProvider; FeatureOptions = featureManagementOptions.Value; @@ -249,7 +249,7 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency private string GetApplicationDistributedLockKey() { - return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpFeatureUpdateLock"; + return $"{CacheOptions.KeyPrefix}_{ApplicationInfoAccessor.ApplicationName}_AbpFeatureUpdateLock"; } private string GetCommonDistributedLockKey() @@ -259,7 +259,7 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency private string GetApplicationHashCacheKey() { - return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpFeaturesHash"; + return $"{CacheOptions.KeyPrefix}_{ApplicationInfoAccessor.ApplicationName}_AbpFeaturesHash"; } private string GetCommonStampCacheKey() diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs index ba0be474f8..594f400a43 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs @@ -22,7 +22,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc protected IPermissionDefinitionRecordRepository PermissionRepository { get; } protected IPermissionDefinitionSerializer PermissionSerializer { get; } protected IDistributedCache Cache { get; } - protected IApplicationNameAccessor ApplicationNameAccessor { get; } + protected IApplicationInfoAccessor ApplicationInfoAccessor { get; } protected IAbpDistributedLock DistributedLock { get; } protected AbpPermissionOptions PermissionOptions { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } @@ -35,7 +35,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc IPermissionDefinitionSerializer permissionSerializer, IDistributedCache cache, IOptions cacheOptions, - IApplicationNameAccessor applicationNameAccessor, + IApplicationInfoAccessor applicationInfoAccessor, IAbpDistributedLock distributedLock, IOptions permissionOptions, ICancellationTokenProvider cancellationTokenProvider) @@ -45,7 +45,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc PermissionRepository = permissionRepository; PermissionSerializer = permissionSerializer; Cache = cache; - ApplicationNameAccessor = applicationNameAccessor; + ApplicationInfoAccessor = applicationInfoAccessor; DistributedLock = distributedLock; CancellationTokenProvider = cancellationTokenProvider; PermissionOptions = permissionOptions.Value; @@ -249,7 +249,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc private string GetApplicationDistributedLockKey() { - return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpPermissionUpdateLock"; + return $"{CacheOptions.KeyPrefix}_{ApplicationInfoAccessor.ApplicationName}_AbpPermissionUpdateLock"; } private string GetCommonDistributedLockKey() @@ -259,7 +259,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc private string GetApplicationHashCacheKey() { - return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpPermissionsHash"; + return $"{CacheOptions.KeyPrefix}_{ApplicationInfoAccessor.ApplicationName}_AbpPermissionsHash"; } private string GetCommonStampCacheKey()