Решение проблемы с дублированием кода у различных сущностей с одинаковым порядком действий, но разной реализацией
нужно разработать программу. Суть её заключается в следующем: нужно прочитать данные из документа, после провести правильность вводимых данных и записать эти данные в базу данных.
Пример:
Имеется класс 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`ы для каждого поставщика из чего вытекают те же проблемы).
