Cześć, tworzę aplikację, która jako jedyne zadanie ma przechowywać informacje o Company, bez jakiejkolwiek logiki biznesowej. Problemem jest wiele integracji, które wymagają różnego mapowania tej encji.
Przykładowy problem nad którym się pochylam:
- Przychodzi request(update) z integracji A, który mapuję na model CompanyA
- Sprawdzam czy są jakieś różnice z zapisanym stanem, jeśli nie to stop.
- Zapisuję CompanyA w bazie danych.
- Normalizuję CompanyA na Company używając do tego modeli z innych integracji, np. CompanyB, CompanyC.
- Sprawdzam czy są różnice, jeśli nie to stop.
- Zapisuję Company w bazie danych.
- Mapuję Company na CompanyView i wysyłam do zewnętrznej integracji.
Zależnie od jakiej integracji jest request, ten potok może się odrobinę różnić. W jaki sposób najlepiej takie pipeline'y zdefiniować? Próbowałem skorzystać z wzorca ChainOfResposibility, ale każdy handler ma inny request i trudno mi napisać sensowną implementację. Teraz spróbowałem wykorzystać MediatR i wyszło coś takiego (pomijam na razie walidację):
public class CompanyAUpdateCommandHandler : IRequestHandler<CompanyAUpdateCommand>
{
private readonly IMediator _mediator;
public CompanyAUpdateCommandHandler(IMediator mediator)
{
_mediator = mediator;
}
public async Task Handle(CompanyAUpdateCommand request, CancellationToken cancellationToken)
{
var companyA = await _mediator.Send(request); //normalizacja request na CompanyA
await _mediator.Send(companyA); //sprawdza różnice ze stanem zapisanym i zapisuje, później będzie obsługa przerwania przy braku różnic
var company = await _mediator.Send(companyA); //normalizacja CompanyA na Company
await _mediator.Send(company); //zapisuje Company
var companyView = await _mediator.Send(company); //mapowanie
var result = await _mediator.Send(companyView); //wysłanie do innej integracji
}
}
I ogólnie wydaje się, że dodawanie kolejnych commandHandlerów do tego pipeline będzie proste, ale po prostu to rozwiązanie też mi się nie podoba. Szczególnie handler odwołujący się do kolejnych handlerów. Z drugiej strony mam możliwość dopisania czegokolwiek pomiędzy Execute kolejnych commandHandlerów, w tym nawet skorzystać z obecnego companyService. Wiem że podobne problemy pewnie już były wiele razy rozwiązane, ale nie mogę znaleźć nic ciekawego. Dlatego jeśli ktoś ma jakieś wskazówki, w tym o czym mógłbym poczytać, to będę wdzięczny.