Browse Source

Merge branch 'dev' into DistributedEventSentAndReceived

pull/16333/head
maliming 4 years ago
parent
commit
70bde955d5
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 2
      docs/en/Distributed-Event-Bus-Kafka-Integration.md
  2. 13
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuGroup.cs
  3. 13
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs
  4. 9
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs
  5. 54
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureSaver.cs
  6. 9
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs
  7. 59
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

2
docs/en/Distributed-Event-Bus-Kafka-Integration.md

@ -110,7 +110,7 @@ You can use any of the [ClientConfig](https://docs.confluent.io/current/clients/
### The Options Classes ### The Options Classes
`AbpRabbitMqOptions` and `AbpRabbitMqEventBusOptions` classes can be used to configure the connection strings and event bus options for the RabbitMQ. `AbpKafkaOptions` and `AbpKafkaEventBusOptions` classes can be used to configure the connection strings and event bus options for the Kafka.
You can configure this options inside the `ConfigureServices` of your [module](Module-Development-Basics.md). You can configure this options inside the `ConfigureServices` of your [module](Module-Development-Basics.md).

13
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuGroup.cs

@ -5,6 +5,7 @@ namespace Volo.Abp.UI.Navigation;
public class ApplicationMenuGroup public class ApplicationMenuGroup
{ {
private string _displayName; private string _displayName;
private string _elementId;
/// <summary> /// <summary>
/// Default <see cref="Order"/> value of a group item. /// Default <see cref="Order"/> value of a group item.
@ -32,7 +33,12 @@ public class ApplicationMenuGroup
/// <summary> /// <summary>
/// Can be used to render the element with a specific Id for DOM selections. /// Can be used to render the element with a specific Id for DOM selections.
/// </summary> /// </summary>
public string ElementId { get; set; } public string ElementId {
get { return _elementId; }
set {
_elementId = NormalizeElementId(value);
}
}
/// <summary> /// <summary>
/// The Display order of the group. /// The Display order of the group.
@ -60,6 +66,11 @@ public class ApplicationMenuGroup
return "MenuGroup_" + Name; return "MenuGroup_" + Name;
} }
private string NormalizeElementId(string elementId)
{
return elementId?.Replace(".", "");
}
public override string ToString() public override string ToString()
{ {
return $"[ApplicationMenuGroup] Name = {Name}"; return $"[ApplicationMenuGroup] Name = {Name}";

13
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs

@ -8,6 +8,7 @@ namespace Volo.Abp.UI.Navigation;
public class ApplicationMenuItem : IHasMenuItems, IHasSimpleStateCheckers<ApplicationMenuItem> public class ApplicationMenuItem : IHasMenuItems, IHasSimpleStateCheckers<ApplicationMenuItem>
{ {
private string _displayName; private string _displayName;
private string _elementId;
/// <summary> /// <summary>
/// Default <see cref="Order"/> value of a menu item. /// Default <see cref="Order"/> value of a menu item.
@ -85,7 +86,12 @@ public class ApplicationMenuItem : IHasMenuItems, IHasSimpleStateCheckers<Applic
/// <summary> /// <summary>
/// Can be used to render the element with a specific Id for DOM selections. /// Can be used to render the element with a specific Id for DOM selections.
/// </summary> /// </summary>
public string ElementId { get; set; } public string ElementId {
get { return _elementId; }
set {
_elementId = NormalizeElementId(value);
}
}
/// <summary> /// <summary>
/// Can be used to render the element with extra CSS classes. /// Can be used to render the element with extra CSS classes.
@ -151,6 +157,11 @@ public class ApplicationMenuItem : IHasMenuItems, IHasSimpleStateCheckers<Applic
{ {
return "MenuItem_" + Name; return "MenuItem_" + Name;
} }
private string NormalizeElementId(string elementId)
{
return elementId?.Replace(".", "");
}
public override string ToString() public override string ToString()
{ {

9
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs

@ -133,7 +133,14 @@ public class AbpFeatureManagementDomainModule : AbpModule
await Policy await Policy
.Handle<Exception>() .Handle<Exception>()
.WaitAndRetryAsync(8, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) * 10)) .WaitAndRetryAsync(
8,
retryAttempt => TimeSpan.FromSeconds(
RandomHelper.GetRandom(
(int)Math.Pow(2, retryAttempt) * 8,
(int)Math.Pow(2, retryAttempt) * 12)
)
)
.ExecuteAsync(async _ => .ExecuteAsync(async _ =>
{ {
try try

54
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/StaticFeatureSaver.cs

@ -27,6 +27,8 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency
protected AbpFeatureOptions FeatureOptions { get; } protected AbpFeatureOptions FeatureOptions { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpDistributedCacheOptions CacheOptions { get; } protected AbpDistributedCacheOptions CacheOptions { get; }
protected IUnitOfWorkManager UnitOfWorkManager { get; }
public StaticFeatureSaver( public StaticFeatureSaver(
IStaticFeatureDefinitionStore staticStore, IStaticFeatureDefinitionStore staticStore,
@ -38,7 +40,8 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency
IApplicationInfoAccessor applicationInfoAccessor, IApplicationInfoAccessor applicationInfoAccessor,
IAbpDistributedLock distributedLock, IAbpDistributedLock distributedLock,
IOptions<AbpFeatureOptions> featureManagementOptions, IOptions<AbpFeatureOptions> featureManagementOptions,
ICancellationTokenProvider cancellationTokenProvider) ICancellationTokenProvider cancellationTokenProvider,
IUnitOfWorkManager unitOfWorkManager)
{ {
StaticStore = staticStore; StaticStore = staticStore;
FeatureGroupRepository = featureGroupRepository; FeatureGroupRepository = featureGroupRepository;
@ -48,12 +51,12 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency
ApplicationInfoAccessor = applicationInfoAccessor; ApplicationInfoAccessor = applicationInfoAccessor;
DistributedLock = distributedLock; DistributedLock = distributedLock;
CancellationTokenProvider = cancellationTokenProvider; CancellationTokenProvider = cancellationTokenProvider;
UnitOfWorkManager = unitOfWorkManager;
FeatureOptions = featureManagementOptions.Value; FeatureOptions = featureManagementOptions.Value;
CacheOptions = cacheOptions.Value; CacheOptions = cacheOptions.Value;
} }
[UnitOfWork] public async Task SaveAsync()
public virtual async Task SaveAsync()
{ {
await using var applicationLockHandle = await DistributedLock.TryAcquireAsync( await using var applicationLockHandle = await DistributedLock.TryAcquireAsync(
GetApplicationDistributedLockKey() GetApplicationDistributedLockKey()
@ -99,19 +102,40 @@ public class StaticFeatureSaver : IStaticFeatureSaver, ITransientDependency
throw new AbpException("Could not acquire distributed lock for saving static features!"); throw new AbpException("Could not acquire distributed lock for saving static features!");
} }
var hasChangesInGroups = await UpdateChangedFeatureGroupsAsync(featureGroupRecords); using (var unitOfWork = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
var hasChangesInFeatures = await UpdateChangedFeaturesAsync(featureRecords);
if (hasChangesInGroups ||hasChangesInFeatures)
{ {
await Cache.SetStringAsync( try
GetCommonStampCacheKey(), {
Guid.NewGuid().ToString(), var hasChangesInGroups = await UpdateChangedFeatureGroupsAsync(featureGroupRecords);
new DistributedCacheEntryOptions { var hasChangesInFeatures = await UpdateChangedFeaturesAsync(featureRecords);
SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable?
}, if (hasChangesInGroups ||hasChangesInFeatures)
CancellationTokenProvider.Token {
); await Cache.SetStringAsync(
GetCommonStampCacheKey(),
Guid.NewGuid().ToString(),
new DistributedCacheEntryOptions {
SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable?
},
CancellationTokenProvider.Token
);
}
}
catch
{
try
{
await unitOfWork.RollbackAsync();
}
catch
{
/* ignored */
}
throw;
}
await unitOfWork.CompleteAsync();
} }
} }

9
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs

@ -118,7 +118,14 @@ public class AbpPermissionManagementDomainModule : AbpModule
await Policy await Policy
.Handle<Exception>() .Handle<Exception>()
.WaitAndRetryAsync(8, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) * 10)) .WaitAndRetryAsync(
8,
retryAttempt => TimeSpan.FromSeconds(
RandomHelper.GetRandom(
(int)Math.Pow(2, retryAttempt) * 8,
(int)Math.Pow(2, retryAttempt) * 12)
)
)
.ExecuteAsync(async _ => .ExecuteAsync(async _ =>
{ {
try try

59
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

@ -28,6 +28,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpDistributedCacheOptions CacheOptions { get; } protected AbpDistributedCacheOptions CacheOptions { get; }
protected IUnitOfWorkManager UnitOfWorkManager { get; }
public StaticPermissionSaver( public StaticPermissionSaver(
IStaticPermissionDefinitionStore staticStore, IStaticPermissionDefinitionStore staticStore,
IPermissionGroupDefinitionRecordRepository permissionGroupRepository, IPermissionGroupDefinitionRecordRepository permissionGroupRepository,
@ -38,8 +40,10 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
IApplicationInfoAccessor applicationInfoAccessor, IApplicationInfoAccessor applicationInfoAccessor,
IAbpDistributedLock distributedLock, IAbpDistributedLock distributedLock,
IOptions<AbpPermissionOptions> permissionOptions, IOptions<AbpPermissionOptions> permissionOptions,
ICancellationTokenProvider cancellationTokenProvider) ICancellationTokenProvider cancellationTokenProvider,
IUnitOfWorkManager unitOfWorkManager)
{ {
UnitOfWorkManager = unitOfWorkManager;
StaticStore = staticStore; StaticStore = staticStore;
PermissionGroupRepository = permissionGroupRepository; PermissionGroupRepository = permissionGroupRepository;
PermissionRepository = permissionRepository; PermissionRepository = permissionRepository;
@ -52,8 +56,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
CacheOptions = cacheOptions.Value; CacheOptions = cacheOptions.Value;
} }
[UnitOfWork] public async Task SaveAsync()
public virtual async Task SaveAsync()
{ {
await using var applicationLockHandle = await DistributedLock.TryAcquireAsync( await using var applicationLockHandle = await DistributedLock.TryAcquireAsync(
GetApplicationDistributedLockKey() GetApplicationDistributedLockKey()
@ -99,19 +102,40 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
throw new AbpException("Could not acquire distributed lock for saving static permissions!"); throw new AbpException("Could not acquire distributed lock for saving static permissions!");
} }
var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords); using (var unitOfWork = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords);
if (hasChangesInGroups ||hasChangesInPermissions)
{ {
await Cache.SetStringAsync( try
GetCommonStampCacheKey(), {
Guid.NewGuid().ToString(), var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords);
new DistributedCacheEntryOptions { var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords);
SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable?
}, if (hasChangesInGroups || hasChangesInPermissions)
CancellationTokenProvider.Token {
); await Cache.SetStringAsync(
GetCommonStampCacheKey(),
Guid.NewGuid().ToString(),
new DistributedCacheEntryOptions {
SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable?
},
CancellationTokenProvider.Token
);
}
}
catch
{
try
{
await unitOfWork.RollbackAsync();
}
catch
{
/* ignored */
}
throw;
}
await unitOfWork.CompleteAsync();
} }
} }
@ -136,7 +160,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
foreach (var permissionGroupRecord in permissionGroupRecords) foreach (var permissionGroupRecord in permissionGroupRecords)
{ {
var permissionGroupRecordInDatabase = permissionGroupRecordsInDatabase.GetOrDefault(permissionGroupRecord.Name); var permissionGroupRecordInDatabase =
permissionGroupRecordsInDatabase.GetOrDefault(permissionGroupRecord.Name);
if (permissionGroupRecordInDatabase == null) if (permissionGroupRecordInDatabase == null)
{ {
/* New group */ /* New group */
@ -291,4 +316,4 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
.ToString() .ToString()
.ToMd5(); .ToMd5();
} }
} }
Loading…
Cancel
Save