1+ using Domain . Interfaces . Providers ;
2+ using Domain . Interfaces . Services ;
3+ using Domain . Models ;
4+
5+ namespace Application . Services . MessageProducers ;
6+
7+ public abstract class BaseMessageProducer < T > : IMessageProducerService
8+ {
9+ private readonly IMessageProducerProvider messageProducerProvider ;
10+ private readonly MessageOptions ? messageOptions ;
11+ private bool disposed ;
12+
13+
14+ protected BaseMessageProducer (
15+ IMessageProducerProvider messageProducerProvider ,
16+ MessageOptions ? messageOptions = null
17+ )
18+ {
19+ this . messageProducerProvider = messageProducerProvider ;
20+ this . messageOptions = messageOptions ;
21+ }
22+
23+
24+ public async Task SendMessagesAsync (
25+ string ? messageText , uint numberOfMessages = 1 , TimeSpan ? delayToSend = null , CancellationToken cancellationToken = default
26+ )
27+ {
28+ if ( string . IsNullOrWhiteSpace ( messageText ) )
29+ return ;
30+
31+ var messageModifier = CreateMessageModifier ( ) ;
32+
33+ if ( numberOfMessages <= 1 )
34+ {
35+ await messageProducerProvider
36+ . SendMessageAsync ( messageText , messageModifier , cancellationToken )
37+ . ConfigureAwait ( false ) ;
38+ }
39+ else if ( delayToSend is null || delayToSend . Value <= TimeSpan . Zero )
40+ {
41+ await messageProducerProvider
42+ . SendMessagesAsync ( messageText , messageModifier , numberOfMessages , cancellationToken )
43+ . ConfigureAwait ( false ) ;
44+ }
45+ else
46+ {
47+ await messageProducerProvider . SendMessagesWithDelayAsync (
48+ messageText , messageModifier , numberOfMessages , delayToSend . Value , cancellationToken
49+ ) . ConfigureAwait ( false ) ;
50+ }
51+ }
52+
53+
54+ private Func < string , BinaryData > CreateMessageModifier ( )
55+ {
56+ return messageInput =>
57+ {
58+ var formatterMessage = ApplyFormattingOptions ( messageInput ) ;
59+ var messageToSend = ApplyEncodingOptions ( formatterMessage ) ;
60+ return EncodeToBinaryData ( messageToSend ) ;
61+ } ;
62+ }
63+
64+ protected virtual string ApplyFormattingOptions ( string messageText )
65+ {
66+ return messageOptions ? . TextProcessingPipeline ? . Process ( messageText ) ?? messageText ;
67+ }
68+
69+ protected abstract T ApplyEncodingOptions ( string message ) ;
70+ protected abstract BinaryData EncodeToBinaryData ( T message ) ;
71+
72+
73+ public async ValueTask DisposeAsync ( )
74+ {
75+ if ( disposed )
76+ return ;
77+
78+ await messageProducerProvider . DisposeAsync ( ) . ConfigureAwait ( false ) ;
79+ GC . SuppressFinalize ( this ) ;
80+ disposed = true ;
81+ }
82+
83+ ~ BaseMessageProducer ( ) => DisposeAsync ( ) . AsTask ( ) . GetAwaiter ( ) . GetResult ( ) ;
84+ }
0 commit comments