Решение проблемы с дублированием кода у различных сущностей с одинаковым порядком действий, но разной реализацией

нужно разработать программу. Суть её заключается в следующем: нужно прочитать данные из документа, после провести правильность вводимых данных и записать эти данные в базу данных.

Пример:

Имеется класс Car:

public class Car{
  public int Id {get;set;}
  public string Name {get;set;}
  public decimal Price {get;set;}
}

В документе записана следующая информация о автомобилях.

введите сюда описание изображения

1. Считываю построчно по машине из документа.
2. Проверяю, что названия автомобилей не повторяются и отрицательных цен нет в считанных машинах.
3. Записываю информацию о автомобилях в базу.
4. Архивирую исходный файл.
5. Загружаю на сторонний сервер сжатый файл.

Первый этап представлен следующим образом:

public class CarReader : ICarReader{
   public List<Car> ReadCarsFromExcel(Stream stream){
      //Создаю ExcelReader, после построчно считываю из документа поля автомобиля
   }
}

Второй этап представлен следующим образом:

public class CarValidator : ICarValidator{
   public List<ValidationError> ValidateCarsAsync(List<Car> cars){
      //Совершаю проверки и возвращаю для каждого поля успех/неуспех валидации с описанием в каком поел ошибка
   }
}

Третий этап представлен следующим образом:

public class CarDatabaseWriter : ICarDatabaseWriter{
   public async Task WriteCarsInDatabaseAsync(List<Car> cars){
      //Записываю информацию о машинах в базу
   }
}

4, 5 Этапы:

public class CarService: ICarService{
    public Task<List<ValidationError>> ImportCarsAsync(string pathToFile){
      var stream = File.OpenRead(pathToFile);
      try{
        var cars = _carReader.ReadCarsFromExcel(stream);
        var validationErrors = await _carValidator.ValidateCarsAsync(cars);
        if(validationErrors.Count==0)
            await _carDatabaseWriter.WriteCarsInDatabaseAsync(cars);
        return validationErrors;
      }catch(Exception ex){
         //обработка
      }finally{
        //Вызов метода архивации файла
        //Вызов метода загрузки файла на сервер
        //Удаление обоих файлов с локальной машины.
      }
    } 
}

Проблема заключается в следующем, если вводится допустим ещё одна сущность Колесо. Для неё будет реализован отличающийся от Автомобиля функционал чтения, валидации, записи в базу. Но архивация/загрузка/удаление файлов одинаковое, и придется в WheelService(Подобие CarService) дублировать эту логику, а если понадобится реализовать ещё один одинаковый функционал для файлов либо например убрать архивацию, то придется во всех Service`ах для каждого из сущностей производить правки, в которых можно ошибиться и мне кажется это ужасным решением.

Мой вопрос заключается в следующем:

Каким организовать интерфейсы для данной программы, для решения этой проблемы? Буду очень признателен! И видать я не понимаю как решать подобные ситуации, когда имеются сущности со одинаковой логикой(схожая проблема имеется: есть программа для агрегации погоды, отправляющая запросы в разные сервисы с погодой, для каждого поставщика погоды приходится писать собственную реализацию для получения погоды, у каждого поставщика разный ответ, я изымаю нужную информацию из каждого поставщика и записываю информацию в базу, и выходит проблема такая же как и в основном моём вопросе, приходится дублировать Service`ы для каждого поставщика из чего вытекают те же проблемы).


Ответы (0 шт):