Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.31 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 type = request.EventType; // тут его может не быть, нужно брать из атрибутов
  84.  
  85.             var builder = _builders.FirstOrDefault(x => x.EventTypes.Contains(type)) ?? throw new Exception("Not Found");
  86.  
  87.             var message = builder.Build(request);
  88.  
  89.             await _client.PublishAsync(message, cancellation);
  90.         }
  91.     }
  92.  
  93.     [EventType(EventType.CustomerAuthenticatedByCert)]
  94.     [EventType(EventType.CustomerAuthenticatedByCert)]
  95.     [EventType(EventType.CustomerAuthenticatedByCert)]
  96.     [EventType(EventType.CustomerAuthenticatedByCert)]
  97.     public sealed class CustomRequest : Request
  98.     {
  99.         public string NotificationText { get; set; }
  100.  
  101.         public PurchaseMethodType PyMethodType { get; set; }
  102.     }
  103.  
  104.     public sealed class MyCustomMessageBuilder : MessageBuilder<CustomRequest>
  105.     {
  106.         protected override EtpEventBusMessage Create(CustomRequest request)
  107.         {
  108.             Message.EventDateTime = DateTime.UtcNow;
  109.  
  110.             Message.EventType = request.PyMethodType == PurchaseMethodType.Auction
  111.                 ? EventType.CustomerAuthenticatedByCert
  112.                 : EventType.AccreditationRequestResultSendNotificationByOperatorForCustomer;
  113.  
  114.             Message.EventAttributes.Add(EtpEventAttributeType.NotificationText, request.NotificationText);
  115.  
  116.             return Message;
  117.         }
  118.     }
  119.  
  120.     public sealed class Client
  121.     {
  122.         public void Do()
  123.         {
  124.             ISender sender = new Sender(new List<IMessageBuilder>(), null);
  125.  
  126.             var request = new Request
  127.             {
  128.                 EntityId = 1,
  129.                 //EventDateTime = DateTime.UtcNow,
  130.                 //NotificationText = nameof(CustomRequest.NotificationText),
  131.             };
  132.  
  133.             sender
  134.                 .SendAsync(request, CancellationToken.None)
  135.                 .GetAwaiter()
  136.                 .GetResult();
  137.         }
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement