Я начал изучать поток данных TPL как решение для рабочего процесса обработки.
Суть рабочего процесса обработки заключается в считывании входных сообщений из нескольких таблиц, создании из них четырех отражающих объектов и сохранении их в четырех других таблицах, поэтому каждое входное сообщение должно приводить к созданию четырех новых сообщений.
Я не могу определить один из предопределенных блоков, которые могут помочь в создании четырех объектов, сначала мне кажется, что TransformManyBlock — это то, что я ищу, но он возвращает несколько объектов одного типа, где у меня будет четыре типа.
Пример проблемы
У нас есть две таблицы, содержащие сведения о сотрудниках из двух устаревших систем, их сущности выглядят так:
public partial class EmployeeTblA
{
public int Id { get; set; }
public int System { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
public int Number { get; set; }
public string Street { get; set; }
public string PostCode { get; set; }
public virtual EmployeeSystem SystemNavigation { get; set; }
}
public partial class EmployeeTblB
{
public int Id { get; set; }
public int System { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string Postcode { get; set; }
public virtual EmployeeSystem SystemNavigation { get; set; }
}
Мы хотим взять данные из двух систем и поместить данные в нашу блестящую новую систему, для этого нам нужно преобразовать сущности из старой системы в сущности, используемые в новой системе. Сначала мы конвертируем сущности из старой системы в базовый класс, который выглядит так:
public class BaseEmployee
{
public int Id { get; set; }
public int System { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string Postcode { get; set; }
}
Затем мы хотим создать три новых объекта из базового класса, которые представляют сущности новой системы, которая выглядит следующим образом:
public partial class EmployeeName
{
public int Id { get; set; }
public int System { get; set; }
public int LegacyId { get; set; }
public string Name { get; set; }
public virtual EmployeeSystem SystemNavigation { get; set; }
}
public partial class EmployeeAge
{
public int Id { get; set; }
public int System { get; set; }
public int LegacyId { get; set; }
public int Age { get; set; }
public virtual EmployeeSystem SystemNavigation { get; set; }
}
public partial class EmployeeAddress
{
public int Id { get; set; }
public int System { get; set; }
public int LegacyId { get; set; }
public string Address { get; set; }
public string Postcode { get; set; }
public virtual EmployeeSystem SystemNavigation { get; set; }
}
Грубый вариант моего TPL для приведенного выше примера
Чтение данных из таблиц в БД в TranformBlock‹Employee,BaseEmployee›, преобразование в общий объект, это дважды для каждой из устаревших систем.
Каждый TranformBlock‹Employee, BaseEmployee› связан с BatchBlock для группировки всех входных потоков.
BatchBlock связан с Block‹BaseEmployee, ...›, который примет входные данные и создаст два новых объекта из входных данных, EmployeeName и EmployeeAge.
Затем Block‹BaseEmployee, ...› будет связан с блоком Action и Action, которые сохранят их в соответствующих таблицах в БД.
Я знаю, что могу создать пользовательский блок, но я не могу понять, как я могу использовать его для предоставления вывода четырем отдельным связанным ActionBlock с использованием потока данных, может ли кто-нибудь указать мне правильное направление?
Employee
, или каждыйEmployee
существует в обеих системах, и вам нужно объединить данные из обеих систем, чтобы получить унифицированную информацию о каждомEmployee
? - person Theodor Zoulias   schedule 17.02.2021ActionBlock<BaseEmployee>
, который создаст одинEmployeeNames
и одинEmployeeAges
для каждого входящегоBaseEmployee
, а затемPost
илиSendAsync
эти объекты непосредственно в два других блока. Другими словами, вы можете заменить функциональностьLinkTo
ручным распространением сообщений от блока к блоку. - person Theodor Zoulias   schedule 17.02.2021BatchBlock
звучит как дополнительное осложнение, которое может не иметь существенного значения для проблемы. Прежде всего,BatchBlock
создает массивы, поэтому вы не можете связать его сActionBlock<BaseEmployee>
. Цель должна бытьActionBlock<BaseEmployee[]>
. Я не знаю, хотите ли вы выполнить разбивку и распространять отдельные объектыEmployeeNames
иEmployeeAges
, или вы хотите распространять их массивы. Между прочим,EmployeeNames
иEmployeeAges
— довольно запутанные имена для классов, которые содержат одну сущность для каждого экземпляра класса. - person Theodor Zoulias   schedule 17.02.2021