Jak używać SignalR

0

Zabrałem się ostatnio za SignalR i w tutorialu znalazłem taki kod:

public class PlaceOrderRequestHandler : IRequestHandler<PlaceOrderCommand>
{
   private readonly IMediator _mediator;

   public PlaceOrderRequestHandler(IMediator mediator)
   {
      _mediator = mediator;
   }
   public async Task<Unit> Handle(PlaceOrderCommand request, CancellationToken cancellationToken)
   {
      // Manipulate your domain object
      // Persist it
      // Publish events      
      // Wait for the matter of the example
      await Task.Delay(2000, cancellationToken);      
      
      // po co?
      await _mediator.Publish(new OrderPlacedEvent { OrderId = Guid.NewGuid() }, cancellationToken);
      return Unit.Value;
   }
}

Co takiego daje wysłanie zdarzenia, czego nie daje po prostu wywołanie jakiegoś _notificationService.SendOrderPlacedNotification(@event)?

5

Przede wszystkim publikacja zdarzenia (tutaj poprzez Mediatora) oddelegowuje całą obsługę różnych zdarzeń do zewnętrznych handlerów, który na dane zdarzenie się zasubskrybują. Dzięki temu unikniesz w PlaceOrderRequestHandler sztywnych odwołań do np. notificationService, emailNotificationService. W miarę jak zacznie dochodzić więcej zdarzeń, które mają reagować na OrderPlacedEvent nie będzie ci w tym handlerze przybywać kodu - będzie czysto i przyjemnie :)

0

No ja myślałem, że eventy służą do jakiejś komunikacji między niezależnymi od siebie modułami. Jeśli kod handlera to jedynie jakieś 60 linii, to czy dodanie tych 10 linii (w tym przypadku 4) tak bardzo go "pobrudzi"? Rozumiem, że MediatR jest (m.in.) po to, aby odchudzić klasy z warstwy aplikacji, ale czy odchudzanie handlerów ma sens?

1

Pytanie nie ma nic wspólnego z SignalR. Z kolei użycie wzorca mediator pozwala na łatwiejsze implementowanie Single Responsibility Principle (jeden handler na jedne command/request/event) jak i pozwala usunąć z klienta wiedzę o tym kto/co obsługuje dane polecenie/zdarzenie. Jedyne co potrzebne to wysłanie odpowiedniego polecenia/zdarzenia do mediatora. Klient nic więcej nie musi wiedzieć- to jak i gdzie jest to obsługiwane nie leży w gestii klienta. Poza tym mediator pomaga zapobiegać pewnej pladze, mianowicie wszystko wiedzących serwisów które czasem są niczym innym jak nową nazwą dla klas managerów. Oczywiście nie jest to główna cecha wzorca mediator a raczej pozytywny efekt uboczny. I tak, można mieć dobrze rozbite, specjalistyczne serwisy. Twierdzę jedynie ze mediator pomaga w uniknięciu rozbudowanych serwisów z wieloma odpowiedzialnościami.

Jeśli dobrze pamiętam to już kiedyś o to pytałeś @nobody01 i dostałeś obszerne odpowiedzi.

0

Kiedys tu ktos pisal, ze wyslanie eventu z handlera zamiast po prostu wywolania serwisu to czesto overengineering. Stad ten watek.

0

No jak masz wyjątkowo prostą aplikację to zapewne tak. W przeciwnym razie to tylko taki "buzzword". Wszystko co się nam nie podoba można nazwać overengineering'iem. A tak naprawdę są to po prostu dobre praktyki. Wolę taki overengineering niż klasę-serwis na 2000 linii kodu. I tak, jakby się ktoś dziwił to 2000 linii kodu to jest bardzo dużo.

0

@Aventus: Jak już jesteśmy przy SignalR, to jeszcze takie pytanko. Gdzie się umieszcza np. NotificationsHub? W warstwie webowej, a warstwa aplikacji korzysta z jakiejś abstrakcji IHub?

1

To zależy. Faktycznie zazwyczaj hub należy do warstwy webowej. Czasem (często?) hub jednak umieszczony jest w oddzielnym serwisie, jako byt niezalezny od innych warstw.

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