Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.25 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using AutoMapper;
  6. using BaseTrade.Integration.Oos94FZ.Domain.Data.Model;
  7. using BaseTrade.Integration.Oos94FZ.Domain.EFRepositoryInterfaces;
  8. using BaseTrade.Integration.Oos94FZ.WcfServices.Contracts.Oos94FZService.Messaging.Revision;
  9. using Public.Common.Extensions;
  10.  
  11. namespace BaseTrade.Integration.Oos94FZ.AppServices.RevisionService
  12. {
  13.     public interface IRevisionFacade
  14.     {
  15.         Task<RevisionResult> HandleAsync(RevisionInfoDto revision);
  16.     }
  17.  
  18.     public sealed class RevisionFacade : IRevisionFacade
  19.     {
  20.         private readonly IEnumerable<IRevisionHandler> _revisionHandlers;
  21.  
  22.         public RevisionFacade(IEnumerable<IRevisionHandler> revisionHandlers)
  23.         {
  24.             _revisionHandlers = revisionHandlers;
  25.         }
  26.  
  27.         public Task<RevisionResult> HandleAsync(RevisionInfoDto revision)
  28.         {
  29.             var type = revision.GetType();
  30.             var handler = _revisionHandlers.FirstOrDefault(x => x.CanHandle(type)) ??
  31.                 throw new InvalidOperationException($"Для удалось найти обработчик для {type.Name}.");
  32.  
  33.             return handler.HandleAsync(revision);
  34.         }
  35.     }
  36.  
  37.     public interface IRevisionProcessor
  38.     {
  39.         Task ProcessAsync(RevisionInfoDto[] revisions);
  40.     }
  41.  
  42.     public sealed class RevisionProcessor : IRevisionProcessor
  43.     {
  44.         private readonly IRevisionFacade _facade;
  45.         private readonly IIntegrationRepository<PackageImportMismatch> _repository;
  46.  
  47.         public RevisionProcessor(IRevisionFacade facade, IIntegrationRepository<PackageImportMismatch> repository)
  48.         {
  49.             _facade = facade;
  50.             _repository = repository;
  51.         }
  52.  
  53.         public async Task ProcessAsync(RevisionInfoDto[] revisions)
  54.         {
  55.             var results = new List<RevisionResult>();
  56.  
  57.             foreach (var revision in revisions)
  58.                 results.Add(await _facade.HandleAsync(revision));
  59.  
  60.             var mismatches = results
  61.                 .Where(x => x.Errors.IsNotEmpty())
  62.                 .Select(x => Mapper.Map(x, Mapper.Map<PackageImportMismatch>(x)))
  63.                 .ToArray();
  64.  
  65.             if (mismatches.IsEmpty())
  66.                 return;
  67.  
  68.             _repository.AddMany(mismatches);
  69.         }
  70.     }
  71.  
  72.     public sealed class RevisionResult
  73.     {
  74.         public List<string> Errors { get; set; }
  75.     }
  76.  
  77.     public interface IRevisionHandler
  78.     {
  79.         Task<RevisionResult> HandleAsync(object revision);
  80.  
  81.         bool CanHandle(Type type);
  82.     }
  83.  
  84.     public interface IRevisionHandler<in TRevision> : IRevisionHandler where TRevision : RevisionInfoDto
  85.     {
  86.         Task<RevisionResult> HandleAsync(TRevision revision);
  87.     }
  88.  
  89.     public abstract class RevisionHandler<T> : IRevisionHandler<T> where T : RevisionInfoDto
  90.     {
  91.         private readonly RevisionResult _revisionResult = new RevisionResult();
  92.  
  93.         public async Task<RevisionResult> HandleAsync(T revision)
  94.         {  
  95.             await HandleRevisionAsync(revision);
  96.  
  97.             return _revisionResult;
  98.         }
  99.  
  100.         public Task<RevisionResult> HandleAsync(object revision)
  101.             => HandleAsync((T) revision);
  102.  
  103.         public bool CanHandle(Type type)
  104.             => typeof(T) == type;
  105.  
  106.         public abstract Task HandleRevisionAsync(T revision);
  107.  
  108.         protected RevisionHandler<T> AddError(string error)
  109.         {
  110.             if (string.IsNullOrWhiteSpace(error))
  111.                 throw new ArgumentException(nameof(error));
  112.  
  113.             _revisionResult.Errors = _revisionResult.Errors ?? new List<string>();
  114.             _revisionResult.Errors.Add(error);
  115.  
  116.             return this;
  117.         }
  118.     }
  119.  
  120.     public sealed class ContractRevisionHandler : RevisionHandler<ContractRevisionInfoDto>
  121.     {
  122.         public override Task HandleRevisionAsync(ContractRevisionInfoDto revision)
  123.         {
  124.             AddError("Ошибка по результату ревизии.");
  125.             AddError("Ошибка по результату ревизии.");
  126.             AddError("Ошибка по результату ревизии.");
  127.             AddError("Ошибка по результату ревизии.");
  128.  
  129.             return Task.CompletedTask;
  130.         }
  131.     }
  132.  
  133.     public sealed class ProcedureRevisionHandler : RevisionHandler<ProcedureRevisionInfoDto>
  134.     {
  135.         public override Task HandleRevisionAsync(ProcedureRevisionInfoDto revision)
  136.         {
  137.             AddError("Ошибка по результату ревизии.");
  138.             AddError("Ошибка по результату ревизии.");
  139.             AddError("Ошибка по результату ревизии.");
  140.  
  141.             return Task.CompletedTask;
  142.         }
  143.     }
  144.  
  145.     public sealed class ProcedureCancellationRevisionHandler : RevisionHandler<ProcedureCancellationRevisionInfoDto>
  146.     {
  147.         public override Task HandleRevisionAsync(ProcedureCancellationRevisionInfoDto revision)
  148.         {
  149.             AddError("Ошибка по результату ревизии.");
  150.             AddError("Ошибка по результату ревизии.");
  151.  
  152.             return Task.CompletedTask;
  153.         }
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement