У меня есть приложение, которое я занимаюсь рефакторингом и пытаюсь следовать некоторым принципам «чистого кода». У меня есть приложение, которое считывает данные из нескольких различных источников данных и обрабатывает / форматирует эти данные и вставляет их в другую базу данных. У меня есть уровень данных с соответствующими DTO, репозиториями, интерфейсами и помощниками для каждого источника данных, а также бизнес-уровень с соответствующими объектами, репозиториями и интерфейсами.

Мой вопрос сводится к методу импорта. У меня в основном есть один метод, который систематически вызывает каждый метод бизнес-логики для чтения, обработки и сохранения данных. Необходимо выполнить много вызовов, и хотя сам метод Import вообще не манипулирует данными, он все еще чрезвычайно велик. Есть ли лучший способ обработки этих данных?

ICustomer<Customer> sourceCustomerList = new CustomerRepository();
foreach (Customer customer in sourceCustomerList.GetAllCustomers())
{

   // Read Some Data
   DataObject object1 = iSourceDataType1.GetDataByCustomerID(customer.ID)
   // Format and save the Data
   iTargetDataType1.InsertDataType1(object1)

   // Read Some Data

   // Format the Data

   // Save the Data

   //...Rinse and repeat
}
0
James Brown 11 Апр 2019 в 23:59

2 ответа

Лучший ответ

Вы должны заглянуть в библиотеку параллельных задач ( TPL) и поток данных

ICustomer<Customer> sourceCustomerList = new CustomerRepository();

var customersBuffer = new BufferBlock<Customer>();
var transformBlock = new TransformBlock<Customer, DataObject>(
    customer => iSourceDataType1.GetDataByCustomerID(customer.ID)
);

// Build your block with TransformBlock, ActionBlock, many more... 
customersBuffer.LinkTo(transformBlock);

// Add all the blocks you need here....

// Then feed the first block or use a custom source
foreach (var c in sourceCustomerList.GetAllCustomers())
    customersBuffer.Post(c)
customersBuffer.Complete();
1
Justin Lessard 11 Апр 2019 в 21:13

Ваша производительность будет зависеть от ввода-вывода, особенно с многочисленными обращениями к базам данных в каждой итерации. Поэтому вам необходимо пересмотреть свою архитектуру, чтобы минимизировать количество операций ввода-вывода.

Можно ли переместить все записи ближе друг к другу (возможно, во временной базе данных) в качестве первого прохода, а затем выполнить сопоставление и форматирование записей в базе данных в качестве второго прохода, прежде чем их считывать и сохранять там, где они должны быть?

(Как примечание стороны, иногда мы увлекаемся DDD и OO, где все «должно» быть объектом. Но это не всегда лучший подход.)

0
RWRkeSBZ 11 Апр 2019 в 21:32