Skip to content

Commit 65da313

Browse files
authored
Add ExchangeType to ExchangeAttribute (#1901)
* Add ExchangeType to ExchangeAttribute * Fixes by review * Update packages * Rename ExchangeTypingConvention * Add messageType to decrease typeof(T) calls
1 parent fc60168 commit 65da313

6 files changed

Lines changed: 43 additions & 25 deletions

File tree

Source/Directory.Packages.props

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
<ItemGroup>
99
<PackageVersion Include="docker.dotnet" Version="3.125.15" />
1010
<PackageVersion Include="EasyNetQ.Management.Client" Version="3.0.1" />
11-
<PackageVersion Include="FluentAssertions" Version="8.8.0" />
12-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
11+
<PackageVersion Include="FluentAssertions" Version="8.9.0" />
12+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
1313
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
1414
<PackageVersion Include="NSubstitute" Version="5.3.0" />
1515
<PackageVersion Include="PublicApiGenerator" Version="11.5.4" />
@@ -32,16 +32,16 @@
3232
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
3333
</ItemGroup>
3434
<ItemGroup Condition="'$(TargetFramework)' == 'net10.0'">
35-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3" />
36-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.3" />
37-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.3" />
38-
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.3" />
35+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.7" />
36+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.7" />
37+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.7" />
38+
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
3939
</ItemGroup>
4040
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
41-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.13" />
42-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.13" />
43-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.13" />
44-
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.13" />
41+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.15" />
42+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.15" />
43+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.15" />
44+
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.15" />
4545
</ItemGroup>
4646
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
4747
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />

Source/EasyNetQ.ApprovalTests/EasyNetQ.approved.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ namespace EasyNetQ
154154
public EasyNetQ.ErrorQueueNameConvention ErrorQueueNamingConvention { get; set; }
155155
public EasyNetQ.ErrorQueueTypeConvention ErrorQueueTypeConvention { get; set; }
156156
public EasyNetQ.ExchangeNameConvention ExchangeNamingConvention { get; set; }
157+
public EasyNetQ.ExchangeTypeConvention ExchangeTypeConvention { get; set; }
157158
public EasyNetQ.QueueNameConvention QueueNamingConvention { get; set; }
158159
public EasyNetQ.QueueTypeConvention QueueTypeConvention { get; set; }
159160
public EasyNetQ.RpcExchangeNameConvention RpcRequestExchangeNamingConvention { get; set; }
@@ -294,7 +295,8 @@ namespace EasyNetQ
294295
public sealed class ExchangeAttribute : System.Attribute
295296
{
296297
public ExchangeAttribute() { }
297-
public ExchangeAttribute(string name) { }
298+
public ExchangeAttribute(string name, string exchangeType = null) { }
299+
public string ExchangeType { get; init; }
298300
public string Name { get; init; }
299301
}
300302
public static class ExchangeDeclareConfigurationExtensions
@@ -310,6 +312,7 @@ namespace EasyNetQ
310312
public const string Header = "headers";
311313
public const string Topic = "topic";
312314
}
315+
public delegate string ExchangeTypeConvention(System.Type messageType);
313316
public class HostConfiguration
314317
{
315318
public HostConfiguration(string host, ushort port) { }
@@ -367,6 +370,7 @@ namespace EasyNetQ
367370
EasyNetQ.ErrorQueueNameConvention ErrorQueueNamingConvention { get; }
368371
EasyNetQ.ErrorQueueTypeConvention ErrorQueueTypeConvention { get; }
369372
EasyNetQ.ExchangeNameConvention ExchangeNamingConvention { get; }
373+
EasyNetQ.ExchangeTypeConvention ExchangeTypeConvention { get; }
370374
EasyNetQ.QueueNameConvention QueueNamingConvention { get; }
371375
EasyNetQ.QueueTypeConvention QueueTypeConvention { get; }
372376
EasyNetQ.RpcExchangeNameConvention RpcRequestExchangeNamingConvention { get; }

Source/EasyNetQ/Conventions.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ namespace EasyNetQ;
66
/// Convention for exchange naming
77
/// </summary>
88
public delegate string ExchangeNameConvention(Type messageType);
9-
9+
/// <summary>
10+
/// Convention for exchange type
11+
/// </summary>
12+
public delegate string ExchangeTypeConvention(Type messageType);
1013
/// <summary>
1114
/// Convention for topic naming
1215
/// </summary>
@@ -77,6 +80,10 @@ public interface IConventions
7780
/// Convention for exchange naming
7881
/// </summary>
7982
ExchangeNameConvention ExchangeNamingConvention { get; }
83+
/// <summary>
84+
/// Convention for exchange type
85+
/// </summary>
86+
ExchangeTypeConvention ExchangeTypeConvention { get; }
8087

8188
/// <summary>
8289
/// Convention for topic naming
@@ -157,7 +164,11 @@ public Conventions(ITypeNameSerializer typeNameSerializer)
157164
var attr = GetExchangeAttribute(type);
158165
return attr.Name ?? typeNameSerializer.Serialize(type);
159166
};
160-
167+
ExchangeTypeConvention = type =>
168+
{
169+
var attr = GetExchangeAttribute(type);
170+
return attr.ExchangeType ?? ExchangeType.Topic;
171+
};
161172
QueueTypeConvention = type =>
162173
{
163174
var attr = GetQueueAttribute(type);
@@ -210,7 +221,8 @@ private static ExchangeAttribute GetExchangeAttribute(Type messageType)
210221

211222
/// <inheritdoc />
212223
public ExchangeNameConvention ExchangeNamingConvention { get; set; }
213-
224+
/// <inheritdoc />
225+
public ExchangeTypeConvention ExchangeTypeConvention { get; set; }
214226
/// <inheritdoc />
215227
public TopicNameConvention TopicNamingConvention { get; set; }
216228

Source/EasyNetQ/DefaultPubSub.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ IAdvancedBus advancedBus
3838
public virtual async Task PublishAsync<T>(T message, Action<IPublishConfiguration> configure, CancellationToken cancellationToken)
3939
{
4040
using var cts = cancellationToken.WithTimeout(configuration.Timeout);
41-
42-
var publishConfiguration = new PublishConfiguration(conventions.TopicNamingConvention(typeof(T)));
41+
var messageType = typeof(T);
42+
var publishConfiguration = new PublishConfiguration(conventions.TopicNamingConvention(messageType));
4343
configure(publishConfiguration);
4444

45-
var messageType = typeof(T);
4645
var advancedMessageProperties = new MessageProperties
4746
{
4847
Priority = publishConfiguration.Priority ?? 0,
@@ -52,7 +51,7 @@ public virtual async Task PublishAsync<T>(T message, Action<IPublishConfiguratio
5251
};
5352
var advancedMessage = new Message<T>(message, advancedMessageProperties);
5453
var exchange = await exchangeDeclareStrategy.DeclareExchangeAsync(
55-
messageType, ExchangeType.Topic, cts.Token
54+
messageType, conventions.ExchangeTypeConvention(messageType), cts.Token
5655
).ConfigureAwait(false);
5756
await advancedBus.PublishAsync(
5857
exchange.Name, publishConfiguration.Topic, null, publishConfiguration.PublisherConfirms, advancedMessage, cts.Token
@@ -75,19 +74,19 @@ CancellationToken cancellationToken
7574
)
7675
{
7776
using var cts = cancellationToken.WithTimeout(configuration.Timeout);
78-
79-
var subscriptionConfiguration = new SubscriptionConfiguration(configuration.PrefetchCount, conventions.QueueTypeConvention(typeof(T)));
77+
var messageType = typeof(T);
78+
var subscriptionConfiguration = new SubscriptionConfiguration(configuration.PrefetchCount, conventions.QueueTypeConvention(messageType), conventions.ExchangeTypeConvention(messageType));
8079
configure(subscriptionConfiguration);
8180

8281
var exchange = await advancedBus.ExchangeDeclareAsync(
83-
exchange: conventions.ExchangeNamingConvention(typeof(T)),
82+
exchange: conventions.ExchangeNamingConvention(messageType),
8483
type: subscriptionConfiguration.ExchangeType,
8584
arguments: subscriptionConfiguration.ExchangeArguments,
8685
cancellationToken: cts.Token
8786
).ConfigureAwait(false);
8887

8988
var queue = await advancedBus.QueueDeclareAsync(
90-
queue: subscriptionConfiguration.QueueName ?? conventions.QueueNamingConvention(typeof(T), subscriptionId),
89+
queue: subscriptionConfiguration.QueueName ?? conventions.QueueNamingConvention(messageType, subscriptionId),
9190
durable: subscriptionConfiguration.Durable,
9291
autoDelete: subscriptionConfiguration.AutoDelete,
9392
arguments: subscriptionConfiguration.QueueArguments,

Source/EasyNetQ/ExchangeAttribute.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ public ExchangeAttribute()
88
{
99

1010
}
11-
public ExchangeAttribute(string name)
11+
public ExchangeAttribute(string name, string exchangeType = null)
1212
{
1313
Name = name;
14+
ExchangeType = exchangeType ?? EasyNetQ.ExchangeType.Topic;
1415
}
1516
public string Name { get; init; }
17+
public string ExchangeType { get; init; }
1618
}

Source/EasyNetQ/SubscriptionConfiguration.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,12 @@ internal class SubscriptionConfiguration : ISubscriptionConfiguration
143143
public bool IsExclusive { get; private set; }
144144
public bool Durable { get; private set; }
145145
public string QueueName { get; private set; }
146-
public string ExchangeType { get; private set; } = EasyNetQ.ExchangeType.Topic;
146+
public string ExchangeType { get; private set; }
147147
public IDictionary<string, object> QueueArguments { get; private set; }
148148
public IDictionary<string, object> ExchangeArguments { get; private set; }
149149
public bool AutoAck { get; private set; }
150150

151-
public SubscriptionConfiguration(ushort defaultPrefetchCount, string queueType = null)
151+
public SubscriptionConfiguration(ushort defaultPrefetchCount, string queueType = null, string exchangeType = null)
152152
{
153153
Topics = new List<string>();
154154
AutoDelete = false;
@@ -158,6 +158,7 @@ public SubscriptionConfiguration(ushort defaultPrefetchCount, string queueType =
158158
Durable = true;
159159
if (queueType != null)
160160
QueueArguments = new Dictionary<string, object> { { Argument.QueueType, queueType } };
161+
ExchangeType = exchangeType ?? EasyNetQ.ExchangeType.Topic;
161162
}
162163
public ISubscriptionConfiguration WithAutoAck()
163164
{

0 commit comments

Comments
 (0)