Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace MyNamespace
- {
- public class Request
- {
- public int EntityId { get; set; }
- public DateTime EventDateTime { get; set; }
- public EventType EventType { get; set; }
- public string ProcedureNumber { get; set; }
- public string Inn { get; set; }
- public string Kpp { get; set; }
- }
- public interface IMessageBuilder
- {
- IEnumerable<EventType> EventTypes { get; }
- EtpEventBusMessage Build(object request);
- }
- public interface IMessageBuilder<in T> : IMessageBuilder where T : Request
- {
- EtpEventBusMessage BuildTyped(T request);
- }
- public abstract class MessageBuilder<T> : IMessageBuilder<T> where T : Request
- {
- protected EtpEventBusMessage Message { get; } = new EtpEventBusMessage();
- public IEnumerable<EventType> EventTypes { get; }
- protected MessageBuilder()
- {
- if (typeof(T).GetCustomAttributes(typeof(EventTypeAttribute), true) is EventTypeAttribute[] attributes && attributes.IsNotEmpty())
- {
- EventTypes = attributes
- .Select(x => x.EventType)
- .ToArray();
- }
- }
- public EtpEventBusMessage Build(object request)
- {
- return BuildTyped((T) request);
- }
- public EtpEventBusMessage BuildTyped(T request)
- {
- Message.EntityId = request.EntityId;
- Message.EventDateTime = request.EventDateTime;
- Message.EventType = request.EventType;
- Message.Inn = "BBB";
- return Create(request);
- }
- protected abstract EtpEventBusMessage Create(T request);
- }
- public interface ISender
- {
- Task SendAsync<TRequest>(TRequest request, CancellationToken cancellation = default) where TRequest : Request;
- }
- public sealed class Sender : ISender
- {
- private readonly IEnumerable<IMessageBuilder> _builders;
- private readonly IMessageQueueClient _client;
- public Sender(IEnumerable<IMessageBuilder> builders, IMessageQueueClient client)
- {
- _builders = builders;
- _client = client;
- }
- public async Task SendAsync<TRequest>(TRequest request, CancellationToken cancellation = default) where TRequest : Request
- {
- var type = request.EventType; // тут его может не быть, нужно брать из атрибутов
- var builder = _builders.FirstOrDefault(x => x.EventTypes.Contains(type)) ?? throw new Exception("Not Found");
- var message = builder.Build(request);
- await _client.PublishAsync(message, cancellation);
- }
- }
- [EventType(EventType.CustomerAuthenticatedByCert)]
- [EventType(EventType.CustomerAuthenticatedByCert)]
- [EventType(EventType.CustomerAuthenticatedByCert)]
- [EventType(EventType.CustomerAuthenticatedByCert)]
- public sealed class CustomRequest : Request
- {
- public string NotificationText { get; set; }
- public PurchaseMethodType PyMethodType { get; set; }
- }
- public sealed class MyCustomMessageBuilder : MessageBuilder<CustomRequest>
- {
- protected override EtpEventBusMessage Create(CustomRequest request)
- {
- Message.EventDateTime = DateTime.UtcNow;
- Message.EventType = request.PyMethodType == PurchaseMethodType.Auction
- ? EventType.CustomerAuthenticatedByCert
- : EventType.AccreditationRequestResultSendNotificationByOperatorForCustomer;
- Message.EventAttributes.Add(EtpEventAttributeType.NotificationText, request.NotificationText);
- return Message;
- }
- }
- public sealed class Client
- {
- public void Do()
- {
- ISender sender = new Sender(new List<IMessageBuilder>(), null);
- var request = new Request
- {
- EntityId = 1,
- //EventDateTime = DateTime.UtcNow,
- //NotificationText = nameof(CustomRequest.NotificationText),
- };
- sender
- .SendAsync(request, CancellationToken.None)
- .GetAwaiter()
- .GetResult();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement