Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.20 KB | None | 0 0
  1. namespace MyNamespace
  2. {
  3.     public class Request
  4.     {
  5.         public int EntityId { get; set; }
  6.  
  7.         public DateTime EventDateTime { get; set; }
  8.  
  9.         public EventType EventType { get; set; }
  10.  
  11.         public string ProcedureNumber { get; set; }
  12.  
  13.         public string Inn { get; set; }
  14.  
  15.         public string Kpp { get; set; }
  16.     }
  17.  
  18.     public interface IMessageBuilder
  19.     {
  20.         IEnumerable<EventType> EventTypes { get; }
  21.  
  22.         EtpEventBusMessage Build(object request);
  23.     }
  24.  
  25.     public interface IMessageBuilder<in T> : IMessageBuilder where T : Request
  26.     {
  27.         EtpEventBusMessage BuildTyped(T request);
  28.     }
  29.  
  30.     public abstract class MessageBuilder<T> : IMessageBuilder<T> where T : Request
  31.     {
  32.         protected EtpEventBusMessage Message { get; } = new EtpEventBusMessage();
  33.  
  34.         public IEnumerable<EventType> EventTypes { get; }
  35.  
  36.         protected MessageBuilder()
  37.         {
  38.             if (typeof(T).GetCustomAttributes(typeof(EventTypeAttribute), true) is EventTypeAttribute[] attributes && attributes.IsNotEmpty())
  39.             {
  40.                 EventTypes = attributes
  41.                     .Select(x => x.EventType)
  42.                     .ToArray();
  43.             }
  44.         }
  45.  
  46.         public EtpEventBusMessage Build(object request)
  47.         {
  48.             return BuildTyped((T) request);
  49.         }
  50.  
  51.         public EtpEventBusMessage BuildTyped(T request)
  52.         {
  53.             Message.EntityId = request.EntityId;
  54.             Message.EventDateTime = request.EventDateTime;
  55.             Message.EventType = request.EventType;
  56.             Message.Inn = "BBB";
  57.  
  58.             return Create(request);
  59.         }
  60.  
  61.         protected abstract EtpEventBusMessage Create(T request);
  62.     }
  63.  
  64.     public interface ISender
  65.     {
  66.         Task SendAsync<TRequest>(TRequest request, CancellationToken cancellation = default) where TRequest : Request;
  67.     }
  68.  
  69.     public sealed class Sender : ISender
  70.     {
  71.         private readonly IEnumerable<IMessageBuilder> _builders;
  72.  
  73.         private readonly IMessageQueueClient _client;
  74.  
  75.         public Sender(IEnumerable<IMessageBuilder> builders, IMessageQueueClient client)
  76.         {
  77.             _builders = builders;
  78.             _client = client;
  79.         }
  80.  
  81.         public async Task SendAsync<TRequest>(TRequest request, CancellationToken cancellation = default) where TRequest : Request
  82.         {
  83.             var builder = _builders.FirstOrDefault(x => x.EventTypes.Contains(request.EventType)) ?? throw new Exception("Not Found");
  84.  
  85.             var message = builder.Build(request);
  86.  
  87.             await _client.PublishAsync(message, cancellation);
  88.         }
  89.     }
  90.  
  91.     [EventType(EventType.CustomerAuthenticatedByCert)]
  92.     [EventType(EventType.CustomerAuthenticatedByCert)]
  93.     [EventType(EventType.CustomerAuthenticatedByCert)]
  94.     [EventType(EventType.CustomerAuthenticatedByCert)]
  95.     public sealed class CustomRequest : Request
  96.     {
  97.         public string NotificationText { get; set; }
  98.  
  99.         public PurchaseMethodType PyMethodType { get; set; }
  100.     }
  101.  
  102.     public sealed class MyCustomMessageBuilder : MessageBuilder<CustomRequest>
  103.     {
  104.         protected override EtpEventBusMessage Create(CustomRequest request)
  105.         {
  106.             Message.EventDateTime = DateTime.UtcNow;
  107.  
  108.             Message.EventType = request.PyMethodType == PurchaseMethodType.Auction
  109.                 ? EventType.CustomerAuthenticatedByCert
  110.                 : EventType.AccreditationRequestResultSendNotificationByOperatorForCustomer;
  111.  
  112.             Message.EventAttributes.Add(EtpEventAttributeType.NotificationText, request.NotificationText);
  113.  
  114.             return Message;
  115.         }
  116.     }
  117.  
  118.     public sealed class Client
  119.     {
  120.         public void Do()
  121.         {
  122.             ISender sender = new Sender(new List<IMessageBuilder>(), null);
  123.  
  124.             var request = new Request
  125.             {
  126.                 EntityId = 1,
  127.                 //EventDateTime = DateTime.UtcNow,
  128.                 //NotificationText = nameof(CustomRequest.NotificationText),
  129.             };
  130.  
  131.             sender
  132.                 .SendAsync(request, CancellationToken.None)
  133.                 .GetAwaiter()
  134.                 .GetResult();
  135.         }
  136.     }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement