MediatR - do jakich cross-cutting concerns?

0

Do jakich cross-cutting concerns używacie MediatR? Na myśl przychodzi mi głównie walidacja requestów i logowanie. Tylko że je można w zasadzie obsłużyć jakimiś HTTP action filters, nie trzeba do tego MediatR. Dlaczego o to pytam? Zacząłem korzystać z FastEndpoints: https://fast-endpoints.com/ i struktura kodu wygląda u mnie teraz następująco:

  • PlaceOrder
    • PlaceOrder
    • PlaceOrderValidator
    • PlaceOrderHandler
    • PlaceOrderEndpoint
  • Other commands...

Czyli trzymam endpoint obok handlera. I tu się zastanawiam: czy powinienem wstrzyknąć PlaceOrderHandler bezpośrednio do PlaceOrderEndpoint? Czy może lepiej wstrzyknąć IMediator i zrobić _mediator.Send()? W pierwszym podejściu zależność jest zdefiniowana explicite. Nie spodziewam się, żeby kiedykolwiek endpoint miał przyjąć inny handler niż ten, który jest zdefiniowany obok, więc nie potrzebuję tego loose coupling, które ma sens w przypadku kontrolerów. Jedyne, co daje mi MediatR, to możliwość podpięcia pipeline'ów do handlerów. Stąd moje pytanie: do jakich cross-cutting concerns używacie MediatR?

CC: @Aventus

1

jeśli nie masz zamiaru używać mediator.send to dla mnie instalowanie tego jest bez sensu. Możesz wstrzyknąć dedykawaną klase do danej funkcjonalności albo opędzić logike z handlera w endpoincie.
Ja pewnie pozostałbym przy mediator.send. Można jakiś pipe dać np na weryfikacje uprawnień

2
nobody01 napisał(a):

Do jakich cross-cutting concerns używacie MediatR? Na myśl przychodzi mi głównie walidacja requestów i logowanie.

Jeszcze np. przechwytywanie niezłapanych wcześniej wyjątków i konwersja ich do jakiejś sensownej struktury błędów.

Tylko że je można w zasadzie obsłużyć jakimiś HTTP action filters, nie trzeba do tego MediatR.

Ale w tym celu trzeba umieścić logikę aplikacyjną w warstwie API.

Pytania na które Ty musisz sobie odpowiedzieć, to:

  1. Czy chcesz umieszczać logikę aplikacji w API.
  2. Czy API to będzie zawsze Twój jedyny interfejs do aplikacji? Co z testami albo np. jakąś kafką?
2

Ja używam MediatR (a konkretnie to wzorca mediator, bo to o niego chodzi) w aplikacjach gdzie mam jasny podział na warstwy. Jeśli mam warstwę aplikacji (web API) i warstwę domeny, to domena posiada logikę biznesową, operuje na modelach domenowych, i nie wie nic o warstwie aplikacji, DTOs, walidacji requestów itp. Wtedy wygląda to tak że endpoint w kontrolerze przyjmuje DTO, które może zawierać atrybuty walidacji. Zakładając że request nie został odrzucony, a więc jego struktura jest poprawna, to następuje mapowanie na polecenie (implementujące IRequest). Samo polecenie jak i handler są zdefiniowane w warstwie domeny (handler zawiera logikę biznesową), więc w kontrolerze używam właśnie _mediator.Send().

1 użytkowników online, w tym zalogowanych: 0, gości: 1