From bec82448f20acadb940c1c938bcca7bd4a745e8b Mon Sep 17 00:00:00 2001
From: cKey <35512826+colinin@users.noreply.github.com>
Date: Thu, 18 Aug 2022 10:50:28 +0800
Subject: [PATCH] feat: Optimize Dapr-DistributedLocking module
---
.../LINGYUN/Abp/Dapr/AbpDaprModule.cs | 4 ++-
.../Dapr/AbpDistributedLockingDaprOptions.cs | 22 ++++++++++++--
.../Dapr/DaprAbpDistributedLock.cs | 13 ++++++--
.../Dapr/ILockOwnerFinder.cs | 8 +++++
.../Dapr/LockOwnerFinder.cs | 30 +++++++++++++++++++
.../README.md | 14 +++++----
6 files changed, 81 insertions(+), 10 deletions(-)
create mode 100644 aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/ILockOwnerFinder.cs
create mode 100644 aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/LockOwnerFinder.cs
diff --git a/aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN/Abp/Dapr/AbpDaprModule.cs b/aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN/Abp/Dapr/AbpDaprModule.cs
index 8928bbfd0..855587bfa 100644
--- a/aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN/Abp/Dapr/AbpDaprModule.cs
+++ b/aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN/Abp/Dapr/AbpDaprModule.cs
@@ -1,7 +1,9 @@
-using Volo.Abp.Modularity;
+using Volo.Abp.Json;
+using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Dapr
{
+ [DependsOn(typeof(AbpJsonModule))]
public class AbpDaprModule : AbpModule
{
}
diff --git a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprOptions.cs b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprOptions.cs
index 054b6b4b8..6a645ab74 100644
--- a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprOptions.cs
+++ b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprOptions.cs
@@ -4,14 +4,32 @@ namespace LINGYUN.Abp.DistributedLocking.Dapr;
public class AbpDistributedLockingDaprOptions
{
+ ///
+ /// The name of the lock store to be queried.
+ ///
+ ///
+ /// default: lockstore
+ ///
public string StoreName { get; set; }
- public string ResourceId { get; set; }
+ ///
+ /// Indicates the identifier of lock owner.
+ ///
+ ///
+ /// default: dapr-lock-owner
+ ///
+ public string DefaultIdentifier { get; set; }
+ ///
+ /// The time after which the lock gets expired.
+ ///
+ ///
+ /// default: 30 seconds
+ ///
public TimeSpan DefaultTimeout { get; set; }
public AbpDistributedLockingDaprOptions()
{
StoreName = "lockstore";
- ResourceId = "dapr-lock-id";
+ DefaultIdentifier = "dapr-lock-owner";
DefaultTimeout = TimeSpan.FromSeconds(30);
}
}
diff --git a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs
index 848fbd819..9a2744c29 100644
--- a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs
+++ b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs
@@ -12,16 +12,19 @@ namespace LINGYUN.Abp.DistributedLocking.Dapr;
[Dependency(ReplaceServices = true)]
public class DaprAbpDistributedLock : IAbpDistributedLock, ITransientDependency
{
+ protected ILockOwnerFinder LockOwnerFinder { get; }
protected IDaprClientFactory DaprClientFactory { get; }
protected AbpDistributedLockingDaprOptions Options { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
public DaprAbpDistributedLock(
+ ILockOwnerFinder lockOwnerFinder,
IDaprClientFactory daprClientFactory,
ICancellationTokenProvider cancellationTokenProvider,
IOptions options)
{
Options = options.Value;
+ LockOwnerFinder = lockOwnerFinder;
DaprClientFactory = daprClientFactory;
CancellationTokenProvider = cancellationTokenProvider;
}
@@ -33,15 +36,21 @@ public class DaprAbpDistributedLock : IAbpDistributedLock, ITransientDependency
timeout = Options.DefaultTimeout;
}
var client = DaprClientFactory.CreateClient();
+ var lockOwner = await LockOwnerFinder.FindAsync();
- var res = await client.Lock(Options.StoreName, name, Options.ResourceId, (int)timeout.TotalSeconds, cancellationToken);
+ var res = await client.Lock(
+ Options.StoreName,
+ name,
+ lockOwner,
+ (int)timeout.TotalSeconds,
+ GetCancellationToken(cancellationToken));
if (res == null || !res.Success)
{
return null;
}
- return new DaprAbpDistributedLockHandle(Options.StoreName, name, Options.ResourceId, client);
+ return new DaprAbpDistributedLockHandle(Options.StoreName, name, lockOwner, client);
}
protected virtual CancellationToken GetCancellationToken(CancellationToken cancellationToken = default)
diff --git a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/ILockOwnerFinder.cs b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/ILockOwnerFinder.cs
new file mode 100644
index 000000000..47c033127
--- /dev/null
+++ b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/ILockOwnerFinder.cs
@@ -0,0 +1,8 @@
+using System.Threading.Tasks;
+
+namespace LINGYUN.Abp.DistributedLocking.Dapr;
+
+public interface ILockOwnerFinder
+{
+ Task FindAsync();
+}
diff --git a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/LockOwnerFinder.cs b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/LockOwnerFinder.cs
new file mode 100644
index 000000000..c60443a9d
--- /dev/null
+++ b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/LINGYUN/Abp/DistributedLocking/Dapr/LockOwnerFinder.cs
@@ -0,0 +1,30 @@
+using Microsoft.Extensions.Options;
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Users;
+
+namespace LINGYUN.Abp.DistributedLocking.Dapr;
+
+public class LockOwnerFinder : ILockOwnerFinder, ITransientDependency
+{
+ protected ICurrentUser CurrentUser { get; }
+ protected AbpDistributedLockingDaprOptions Options { get; }
+
+ public LockOwnerFinder(
+ ICurrentUser currentUser,
+ IOptions options)
+ {
+ Options = options.Value;
+ CurrentUser = currentUser;
+ }
+
+ public Task FindAsync()
+ {
+ if (CurrentUser.IsAuthenticated)
+ {
+ return Task.FromResult(CurrentUser.GetId().ToString("N"));
+ }
+
+ return Task.FromResult(Options.DefaultIdentifier);
+ }
+}
diff --git a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/README.md b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/README.md
index 54c4680d1..a5adf52f0 100644
--- a/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/README.md
+++ b/aspnet-core/modules/dapr/LINGYUN.Abp.DistributedLocking.Dapr/README.md
@@ -12,12 +12,12 @@ See: https://docs.dapr.io/developing-applications/building-blocks/distributed-lo
[DependsOn(typeof(AbpDistributedLockingDaprModule))]
public class YouProjectModule : AbpModule
{
- public override void ConfigureServices(ServiceConfigurationContext context)
+ public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure(options =>
{
options.StoreName = "store-name";
- options.ResourceId = "resource-id";
+ options.DefaultIdentifier = "default-owner-id";
options.DefaultTimeout = TimeSpan.FromSeconds(30);
});
}
@@ -26,9 +26,13 @@ public class YouProjectModule : AbpModule
## 配置说明
-* AbpDistributedLockingDaprOptions.StoreName 在dapr component文件中定义的metadata name,默认: lockstore;
-* AbpDistributedLockingDaprOptions.ResourceId 自定义一个资源名称,用于向dapr提供锁定的标识,默认: dapr-lock-id;
-* AbpDistributedLockingDaprOptions.DefaultTimeout 默认锁定超时时间,默认: 30s.
+* AbpDistributedLockingDaprOptions.StoreName 在dapr component文件中定义的metadata name,默认: lockstore;
+* AbpDistributedLockingDaprOptions.DefaultIdentifier 默认锁资源拥有者标识,默认: dapr-lock-owner;
+* AbpDistributedLockingDaprOptions.DefaultTimeout 默认锁定超时时间,默认: 30s.
+## 接口说明
+
+[ILockOwnerFinder](./LINGYUN/Abp/DistributedLocking/Dapr/ILockOwnerFinder), 提供锁资源持有者标识
+默认实现 [LockOwnerFinder](./LINGYUN/Abp/DistributedLocking/Dapr/LockOwnerFinder), 获取用户标识,如果不存在,返回DefaultIdentifier
## 其他