Рефакторинг сервисов парсинга

This commit is contained in:
Степанов Дмитрий 2024-02-16 11:53:10 +03:00
parent 8a429cfe8b
commit 63e2e1b180
10 changed files with 22 additions and 105 deletions

View File

@ -8,10 +8,8 @@ namespace AsbCloudApp.Services;
/// Сервис парсинга
/// </summary>
/// <typeparam name="TDto"></typeparam>
/// <typeparam name="TOptions"></typeparam>
public interface IParserService<TDto, in TOptions> : IParserService
public interface IParserService<TDto> : IParserService
where TDto : class, IId
where TOptions : IParserOptionsRequest
{
/// <summary>
/// Распарсить файл
@ -19,7 +17,8 @@ public interface IParserService<TDto, in TOptions> : IParserService
/// <param name="file"></param>
/// <param name="options"></param>
/// <returns></returns>
ParserResultDto<TDto> Parse(Stream file, TOptions options);
ParserResultDto<TDto> Parse<TOptions>(Stream file, TOptions options)
where TOptions : IParserOptionsRequest;
/// <summary>
/// Получение шаблона для заполнения

View File

@ -332,21 +332,11 @@ namespace AsbCloudInfrastructure
services.AddTransient<IWellSectionPlanRepository, WellSectionPlanRepository>();
services.AddTransient<IWellOperationCategoryRepository, WellOperationCategoryRepository>();
services.AddTransient<IDetectedOperationRepository, DetectedOperationRepository>();
services.AddTransient<ParserServiceFactory>(serviceProvider =>
{
var parsers = new Dictionary<int, Func<IParserService>>
{
{ ParserIds.IdTrajectoryPlanParser, () => new TrajectoryPlanParser(serviceProvider) },
{ ParserIds.IdTrajectoryFactManualParser, () => new TrajectoryFactManualParser(serviceProvider) },
{ ParserIds.IdProcessMapPlanDrillingParser, () => new ProcessMapPlanDrillingParser(serviceProvider) }
};
var factory = new ParserServiceFactory(parsers);
return factory;
});
services.AddTransient<TrajectoryPlanParser>();
services.AddTransient<TrajectoryFactManualParser>();
services.AddTransient<ProcessMapPlanDrillingParser>();
return services;
}
}

View File

@ -12,17 +12,9 @@ using Mapster;
namespace AsbCloudInfrastructure.Services.Parser;
public abstract class ParserExcelService<TDto, TOptions> : IParserService<TDto, TOptions>
public abstract class ParserExcelService<TDto> : IParserService<TDto>
where TDto : class, IValidatableObject, IId
where TOptions : IParserOptionsRequest
{
protected readonly IServiceProvider serviceProvider;
protected ParserExcelService(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
protected abstract string SheetName { get; }
protected virtual int HeaderRowsCount => 0;
@ -31,7 +23,8 @@ public abstract class ParserExcelService<TDto, TOptions> : IParserService<TDto,
protected abstract IDictionary<string, Cell> Cells { get; }
public virtual ParserResultDto<TDto> Parse(Stream file, TOptions options)
public virtual ParserResultDto<TDto> Parse<TOptions>(Stream file, TOptions options)
where TOptions : IParserOptionsRequest
{
using var workbook = new XLWorkbook(file);
var sheet = workbook.GetWorksheet(SheetName);

View File

@ -1,8 +0,0 @@
namespace AsbCloudInfrastructure.Services.Parser;
public static class ParserIds
{
public const int IdTrajectoryFactManualParser = 1;
public const int IdTrajectoryPlanParser = 2;
public const int IdProcessMapPlanDrillingParser = 3;
}

View File

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using AsbCloudApp.Data;
using AsbCloudApp.Requests.ParserOptions;
using AsbCloudApp.Services;
namespace AsbCloudInfrastructure.Services.Parser;
public class ParserServiceFactory
{
private readonly IDictionary<int, Func<IParserService>> parsers;
public ParserServiceFactory(IDictionary<int, Func<IParserService>> parsers)
{
this.parsers = parsers;
}
public IParserService<TDto, TOptions> Create<TDto, TOptions>(int idParserService)
where TDto : class, IId
where TOptions : IParserOptionsRequest
{
if (!parsers.TryGetValue(idParserService, out var parserService))
throw new ArgumentNullException(nameof(idParserService), "Не правильный идентификатор парсера");
return parserService.Invoke() as IParserService<TDto, TOptions>
?? throw new ArgumentNullException(nameof(idParserService), "Ошибка приведения типа");
}
}

View File

@ -14,11 +14,8 @@ public class ProcessMapPlanDrillingParser : ProcessMapPlanParser<ProcessMapPlanD
{
private readonly IEnumerable<WellSectionTypeDto> sections;
public ProcessMapPlanDrillingParser(IServiceProvider serviceProvider)
: base(serviceProvider)
public ProcessMapPlanDrillingParser(IWellOperationRepository wellOperationRepository)
{
var wellOperationRepository = serviceProvider.GetRequiredService<IWellOperationRepository>();
sections = wellOperationRepository.GetSectionTypes();
}

View File

@ -1,20 +1,12 @@
using System;
using System.IO;
using AsbCloudApp.Data;
using AsbCloudApp.Data.ProcessMapPlan;
using AsbCloudApp.Requests.ParserOptions;
using AsbCloudInfrastructure.Services.Parser;
namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser;
public abstract class ProcessMapPlanParser<TDto> : ParserExcelService<TDto, IParserOptionsRequest>
public abstract class ProcessMapPlanParser<TDto> : ParserExcelService<TDto>
where TDto : ProcessMapPlanBaseDto
{
protected ProcessMapPlanParser(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
protected override int HeaderRowsCount => 2;
protected static int? GetIdMode(string? modeName) =>

View File

@ -1,18 +1,11 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Requests.ParserOptions;
using AsbCloudInfrastructure.Services.Parser;
namespace AsbCloudInfrastructure.Services.Trajectory.Parser;
public class TrajectoryFactManualParser : ParserExcelService<TrajectoryGeoFactDto, IParserOptionsRequest>
public class TrajectoryFactManualParser : ParserExcelService<TrajectoryGeoFactDto>
{
public TrajectoryFactManualParser(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
protected override string SheetName => "Фактическая траектория";
protected override int HeaderRowsCount => 2;

View File

@ -1,18 +1,11 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Requests.ParserOptions;
using AsbCloudInfrastructure.Services.Parser;
namespace AsbCloudInfrastructure.Services.Trajectory.Parser;
public class TrajectoryPlanParser : ParserExcelService<TrajectoryGeoPlanDto, IParserOptionsRequest>
public class TrajectoryPlanParser : ParserExcelService<TrajectoryGeoPlanDto>
{
public TrajectoryPlanParser(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
protected override string SheetName => "Плановая траектория";
protected override int HeaderRowsCount => 2;

View File

@ -2,6 +2,7 @@
using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Requests.ParserOptions;
using AsbCloudInfrastructure.Services.Parser;
using AsbCloudInfrastructure.Services.Trajectory.Parser;
using Xunit;
namespace AsbCloudWebApi.Tests.Services.Trajectory;
@ -10,8 +11,9 @@ public class TrajectoryParserTest
{
private const string UsingTemplateFile = "AsbCloudWebApi.Tests.Services.Trajectory.Templates";
private readonly ParserServiceFactory parserServiceFactory;
private readonly TrajectoryPlanParser trajectoryPlanParser = new();
private readonly TrajectoryFactManualParser trajectoryFactManualParser = new();
[Fact]
public void Parse_trajectory_plan()
{
@ -20,11 +22,8 @@ public class TrajectoryParserTest
if (stream is null)
Assert.Fail("Файла для импорта не существует");
var parserService = parserServiceFactory.Create<TrajectoryGeoPlanDto, IParserOptionsRequest>(
ParserIds.IdTrajectoryPlanParser);
var trajectoryRows = parserService.Parse(stream, IParserOptionsRequest.Empty());
var trajectoryRows = trajectoryPlanParser.Parse(stream, IParserOptionsRequest.Empty());
Assert.Equal(3, trajectoryRows.Item.Count());
}
@ -38,10 +37,7 @@ public class TrajectoryParserTest
if (stream is null)
Assert.Fail("Файла для импорта не существует");
var parserService = parserServiceFactory.Create<TrajectoryGeoFactDto, IParserOptionsRequest>(
ParserIds.IdTrajectoryFactManualParser);
var trajectoryRows = parserService.Parse(stream, IParserOptionsRequest.Empty());
var trajectoryRows = trajectoryFactManualParser.Parse(stream, IParserOptionsRequest.Empty());
Assert.Equal(4, trajectoryRows.Item.Count());
}