yambroskin

Untitled

Sep 15th, 2021
730
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Linq;
  3. using EleWise.ELMA.Logging;
  4. using EleWise.ELMA.Runtime.NH;
  5. using EleWise.ELMA.Services;
  6. using Newtonsoft.Json;
  7. using Yambr.ELMA.MessageQueueRMQ.ExtensionPoints;
  8. using Yambr.ELMA.MessageQueueRMQ.Extensions;
  9.  
  10. namespace Yambr.ELMA.MessageQueueRMQ.Components
  11. {
  12.  
  13.     public abstract class AbstractRabbitMessageHandler<TMessage, TResult> : IRabbitMessageHandler
  14.         where TMessage : class
  15.     {
  16.         /// <summary>
  17.         /// Логгер очереди
  18.         /// </summary>
  19.         protected readonly ILogger Logger = MessageQueueRMQLogger.Logger;
  20.         /// <summary>
  21.         /// Настройки сериалайзера - можно переопределить
  22.         /// </summary>
  23.         protected virtual JsonSerializerSettings SerializerSettings => null;
  24.         private IUnitOfWorkManager _unitOfWorkManager;
  25.         /// <summary>
  26.         /// Менеджер работы с UnitOfWork
  27.         /// </summary>
  28.         public IUnitOfWorkManager UnitOfWorkManager => _unitOfWorkManager ?? (_unitOfWorkManager = Locator.GetServiceNotNull<IUnitOfWorkManager>());
  29.  
  30.         public abstract string[] Model { get; }
  31.         public virtual bool CheckModel(string model)
  32.         {
  33.             if (Model == null || Model.Length == 0) return true;
  34.             return Model.Contains(model);
  35.         }
  36.  
  37.         public void Execute(string message, string model)
  38.         {
  39.             if (message == null) throw new ArgumentNullException(nameof(message));
  40.             if (model == null) throw new ArgumentNullException(nameof(model));
  41.  
  42.             var result = default(TResult);
  43.             Action runAction = () =>
  44.             {
  45.                 var messageObject = Before(message, model);
  46.                 if (messageObject == null) return;
  47.  
  48.                 result = Run(messageObject);
  49.             };
  50.             Action<Exception> errorCallBack = exception =>
  51.             {
  52.                 Logger.Error(exception);
  53.                 throw exception;
  54.             };
  55.             Action successCallback = () =>
  56.             {
  57.                 //TODO обдумать реализацию
  58.                 if (result != null) //TODO: V3111 https://www.viva64.com/en/w/v3111/ Checking value of 'result' for null will always return false when generic type is instantiated with a value type.
  59.                 {
  60.                     After(result);
  61.                 }
  62.             };
  63.             runAction.InNewThread(
  64.                 "Загрузка из Rabbit " + model,
  65.                 errorCallBack,
  66.                 successCallback);
  67.  
  68.         }
  69.         public virtual TMessage Before(string message, string model)
  70.         {
  71.             return CheckModel(model) && !string.IsNullOrWhiteSpace(message)
  72.                 ? JsonConvert.DeserializeObject<TMessage>(message, SerializerSettings)
  73.                 : null;
  74.         }
  75.  
  76.         public abstract TResult Run(TMessage message);
  77.         public virtual void After(TResult result)
  78.         {
  79.         }
  80.     }
  81. }
  82.  
RAW Paste Data