From f5d5838f91222a582fcefc8478e8904795803f36 Mon Sep 17 00:00:00 2001 From: JonnyII <102029509+JonnyII@users.noreply.github.com> Date: Fri, 14 Oct 2022 19:21:13 +0200 Subject: [PATCH] add HashCodeMEssageExtractor Factory method (#6173) * feat: add add HashCodeMEssageExtractor Factory method * test: verified change of previous commit * test: verified missing api changes Co-authored-by: Aaron Stannard Co-authored-by: Gregorius Soedharmo --- .../Akka.Cluster.Sharding/ClusterSharding.cs | 30 ++++++++++++++++++- ...c.ApproveClusterSharding.Core.verified.txt | 1 + ...ApproveClusterSharding.DotNet.verified.txt | 1 + ...ec.ApproveClusterSharding.Net.verified.txt | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/contrib/cluster/Akka.Cluster.Sharding/ClusterSharding.cs b/src/contrib/cluster/Akka.Cluster.Sharding/ClusterSharding.cs index 45c136fe4aa..d09f5baa0a9 100644 --- a/src/contrib/cluster/Akka.Cluster.Sharding/ClusterSharding.cs +++ b/src/contrib/cluster/Akka.Cluster.Sharding/ClusterSharding.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Runtime.ExceptionServices; using System.Threading.Tasks; + using Akka.Actor; using Akka.Cluster.Tools.Singleton; using Akka.Configuration; @@ -54,6 +55,33 @@ public override ClusterSharding CreateExtension(ExtendedActorSystem system) /// public abstract class HashCodeMessageExtractor : IMessageExtractor { + private class Implementation : HashCodeMessageExtractor + { + private readonly Func _entityIdExtractor; + private readonly Func _messageExtractor; + public Implementation(int maxNumberOfShards, Func entityIdExtractor, Func messageExtractor = null) : base(maxNumberOfShards) + { + _entityIdExtractor = entityIdExtractor ?? throw new NullReferenceException(nameof(entityIdExtractor)); + _messageExtractor = messageExtractor; + } + + public override string EntityId(object message) + => _entityIdExtractor.Invoke(message); + + public override object EntityMessage(object message) + => _messageExtractor?.Invoke(message) ?? base.EntityMessage(message); + } + + /// + /// creates a instance of the with the given handlers + /// + /// + /// + /// + /// + public static HashCodeMessageExtractor Create(int maxNumberOfShards, Func entityIdExtractor, Func messageExtractor = null) + => new Implementation(maxNumberOfShards, entityIdExtractor, messageExtractor); + /// /// TBD /// @@ -1459,7 +1487,7 @@ internal static class Extensions /// TBD public static ExtractEntityId ToExtractEntityId(this IMessageExtractor self) { - Option<(EntityId, Msg)> ExtractEntityId (object msg) + Option<(EntityId, Msg)> ExtractEntityId(object msg) { if (self.EntityId(msg) != null) return (self.EntityId(msg), self.EntityMessage(msg)); diff --git a/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Core.verified.txt b/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Core.verified.txt index 0420132d415..04292d46f46 100644 --- a/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Core.verified.txt +++ b/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Core.verified.txt @@ -152,6 +152,7 @@ namespace Akka.Cluster.Sharding { public readonly int MaxNumberOfShards; protected HashCodeMessageExtractor(int maxNumberOfShards) { } + public static Akka.Cluster.Sharding.HashCodeMessageExtractor Create(int maxNumberOfShards, System.Func entityIdExtractor, System.Func messageExtractor = null) { } public abstract string EntityId(object message); public virtual object EntityMessage(object message) { } public virtual string ShardId(object message) { } diff --git a/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.DotNet.verified.txt b/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.DotNet.verified.txt index db27986094d..8a6e528bb46 100644 --- a/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.DotNet.verified.txt +++ b/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.DotNet.verified.txt @@ -152,6 +152,7 @@ namespace Akka.Cluster.Sharding { public readonly int MaxNumberOfShards; protected HashCodeMessageExtractor(int maxNumberOfShards) { } + public static Akka.Cluster.Sharding.HashCodeMessageExtractor Create(int maxNumberOfShards, System.Func entityIdExtractor, System.Func messageExtractor = null) { } public abstract string EntityId(object message); public virtual object EntityMessage(object message) { } public virtual string ShardId(object message) { } diff --git a/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Net.verified.txt b/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Net.verified.txt index 0420132d415..04292d46f46 100644 --- a/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Net.verified.txt +++ b/src/core/Akka.API.Tests/verify/CoreAPISpec.ApproveClusterSharding.Net.verified.txt @@ -152,6 +152,7 @@ namespace Akka.Cluster.Sharding { public readonly int MaxNumberOfShards; protected HashCodeMessageExtractor(int maxNumberOfShards) { } + public static Akka.Cluster.Sharding.HashCodeMessageExtractor Create(int maxNumberOfShards, System.Func entityIdExtractor, System.Func messageExtractor = null) { } public abstract string EntityId(object message); public virtual object EntityMessage(object message) { } public virtual string ShardId(object message) { }