Tworzenie abstrakcji nad MediatR

Tworzenie abstrakcji nad MediatR
N0
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Gdańsk
  • Postów:647
0

Czy warto tworzyć abstrakcję nad MediatR? Czy może jest to jedna z tych bibliotek, dla których nie warto, tak jak np. EF? A jeśli już tworzyć (bo projekt będzie duży), to jak? Przez pisanie interfejsów dziedziczących po interfejsach z MediatR i to ich implementowanie? Coś w stylu

Kopiuj
public interface ICommandHandler<TRequest> : IRequestHandler<TRequest, Result> where TRequest : ICommand { }
Kopiuj
public interface ICommand : IRequest<Result> { }

Do tego jakaś szyna opakowująca klasę Mediator, którą można by wstrzykiwać do kontrolerów.

edytowany 2x, ostatnio: nobody01
E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:10 miesięcy
  • Postów:395
3

Jeśli ma to sens to warto. Jeśli nie ma, to nie warto. Musisz sam sobie odpowiedzieć czy w Twoim projekcie taka abstrakcja będzie miała sens. Abstrakcja dla samej abstrakcji, bo tak było w jakimś tutorialu to jeden z częstszych błędów projektowania w ówczesnych projektach. W ogóle masz na myśli opakowanie całego frameworka czy jakichś jego części ? Jeśli części to pewnie znalazłeś już jakiś konkretny powód stworzenia tej abstrakcji.

N0
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Gdańsk
  • Postów:647
0

MediatR ma wszystko to, czego potrzebuję, a przynajmniej tak mi się wydaje. No może definicje klas requestów są zbyt rozwlekłe, jeśli chce się zwracać jakiś typ generyczny z handlerów: public class XCommand : IRequest<RequestResult<YModel>>.

Ludzie piszą, że należy tworzyć warstwę abstrakcji nad bibliotekami, które mogą w przyszłości zostać zamienione na inne. Ale przecież na początku projektu nie wiadomo, czy do biblioteki, której planuje się używać, nie wyjdzie w przyszłości jakaś lepsza alternatywa, więc należałoby pisać abstrakcję do wszystkich, które są używane w wielu miejscach. Jak żyć? :/

E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:10 miesięcy
  • Postów:395
4

No i przez takich ludzi powstała słynna abstrakcja na Entity Frameworku zwana repozytorium. Przy podmianie "core'owych" bibliotek powstanie wiele różnych innych problemów niż sam brak abstrakcji. Tego się po prostu prawie nigdy nie robi. Poza tym taką abstrakcje jest ciężko napisać lub jest to niemożliwe tak żeby przy podmianie biblioteki nie zaszła potrzeba robienia brzydkich hacków by wpiąć się w jej następce. Jedyny raz gdzie widziałem sens takiej abstrakcji to był sens biznesowy, gdzie jedno rozwiązanie było w chmurze (płatne) i nie wiadomo było, czy koszta sporo nie przewyższą kosztów utrzymywania darmowego odpowiednika. W tym przypadku wiadomo było, że może nastąpić podmiana. W przypadku biblioteki takiej jak Mediator nie widzę sensu takiej abstrakcji.

edytowany 1x, ostatnio: error91
Visual Code
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:107
0

Jakie chcesz osiągnąć korzyści ze skorzystania z MediatR, bo jeżeli tylko dla zwiększenia loose coupling to może powinieneś się zastanowić nad innymi bardziej przystępnymi sposobami, wszystko zależy od złożoności projektu, być może taka abstrakcja nie jest potrzebna, ale jak najbardziej jest stosowana z powodzeniem. Myślę, że jednym z lepszych przykładów zastosowania MediatR to cqrs z event sourcing, bo miałem z tym doświadczenie, a poza tym to ciężko mi powiedzieć. W ogóle robisz to na poważnie, bo zwykle taką decyzje podejmuje cały team albo ktoś odpowiedzialny za projekt , kto miał z takimi rzeczami doświadczenie.

edytowany 2x, ostatnio: Visual Code
N0
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Gdańsk
  • Postów:647
0

@Visual Code: Używam MediatR do CQRS we własnym projekcie.

Visual Code
No to bardzo dobrze. Zawsze się czegoś nowego nauczysz i rozwiniesz.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 godzin
  • Postów:5107
0

@error91:

W ogóle po co ludzie używają Repo jeżeli nierzadko podmiana bazy ogranicza się do podmiany drivera?

edytowany 1x, ostatnio: WeiXiao
mad_penguin
mad_penguin
Na wypadek gdyby kiedyś chcieli zmienić EF na coś innego, czyli nigdy :)
E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:10 miesięcy
  • Postów:395
1

@WeiXiao: Bardziej tutaj chodzi o argument podmiany ORM'a. Podmiana bazy to już w ogóle hardcore na produkcyjnej aplikacji, na pewno nie tylko podmiana drivera. Odpowiadając na pytanie to ludzie używają różnych wzorców nie mając pojęcia jaki problem dany wzorzec rozwiązuje.

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 godzin
  • Postów:5107
0
error91 napisał(a):

@WeiXiao: Bardziej tutaj chodzi o argument podmiany ORM'a. Podmiana bazy to już w ogóle hardcore na produkcyjnej aplikacji, na pewno nie tylko podmiana drivera. Odpowiadając na pytanie to ludzie używają różnych wzorców nie mając pojęcia jaki problem dany wzorzec rozwiązuje.

W aplikacji podmiana drivera(no bo co jeszcze?) przy założeniu, że ten sam ORM, a na poziomie bazy export, odtworzenie schemy i jakoś przeniesienie danych :D

Wszystko chyba zależy z jakiej bazy na jaką - czasem jest łatwiej, a czasem trudniej :>

edytowany 3x, ostatnio: WeiXiao
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0
WeiXiao napisał(a):

@error91:

W ogóle po co ludzie używają Repo jeżeli nierzadko podmiana bazy ogranicza się do podmiany drivera?

Jeśli mowa o przypadkach gdzie stosują generyczne (lub nie) interfejsy, które tak naprawdę wystawiają dokładnie to samo na co pozwala czysty dostęp do kontekstu EF to faktycznie, jest to bez sensu. Natomiast jak najbardziej ma sens wyabstrachowanie EF, np. jeśli chcemy by nasz store/repository/cokolwiek dostarczał konkretnych kontraktów i zapobiegał samowolce w kodzie. Widok taki jak _context.SomeSet.Add(someObject) w różnych miejscach w kodzie jest dla mnie równie absurdalny co bezmyślne tworzenie repozytorium nie różniące się w zasadzie od czystego dostępu do kontekstu. Nie mówiąc już o stosowaniu zapytań na IQueryable gdzie popadnie (tutaj przydatne staje się użycie obiektów query które enkapsulują zapytania).

Co do sugestii odnośnie stosowania MediatR tylko po to by zwiększyć loose coupling- nie ma w tym nic złego i jest szeroko stosowane, a nazywa się to właśnie CQRS. Nie jest to CQRS na poziomie infrastruktury- gdzie moglibyśmy mieć oddzielny serwis do odczytu i zapisu- a CQRS w procesie. Nie zmienia to faktu że jest to właśnie CQRS które znaczenia ułatwia loose coupling, a poza tym pozwala na "odśmiecenie" kontrolerów. Dependency Inversion nie jest w żadnym razie alternatywą, a świetnym uzupełnień zastosowania MediatR. Zależności mogą zostać wstrzyknięte do handlerów.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
WeiXiao
Ucięło Ci sekcję [ponieważ] do części 1, dziwne... :P
Aventus
Nie martw się, nie ucięło :) po prostu były to tematy już tyle razy wałkowane i oczywiste, że nie chce mi się na ten temat po raz N pisać esejów. Szczególnie jeśli miało by to rozpocząć dyskusje z Tobą, bez urazy ale parę razy już widziałem Twoje popisy na tym forum.
WeiXiao
@Aventus: uu pocisk :D a które, bo jestem ciekaw
Aventus
W żadnym razie pocisk, po prostu stwierdzam fakt. Nie będę teraz forum przeszukiwał, bez przesady :)
WeiXiao
W żadnym razie pocisk, po prostu stwierdzam fakt to tak nie działa :D Jak Pani oddającej się na lewo i prawo powiesz "jesteś największą [hoe] na tym osiedlu" to nadal stwierdziłeś fakt oraz jej pojechałeś :) Niektórzy nawet się w ten sposób usprawiedliwiają, co jest w ogóle patologiczne
E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:10 miesięcy
  • Postów:395
0

@WeiXiao: No dokładnie to zależy. Przy zmianie z relacyjnej na relacyjną będzie mniej problemów niż z relacyjnej na jakiś NoSQL. Większość poza aplikacją, więc argument za repo, że abstrakcja nad ORM'em w czymś pomoże jest bez sensu bo masa większych problemów przy zmianie będzie poza aplikacją.

@Aventus: W większości przypadków "repozytorium" wygląda tak jak opisałeś w pierwszym zdaniu. Przynajmniej ja na takie trafiałem. Kod typu _context.SomeSet.Add(someObject) powinień być w serwisach aplikacyjnych i tyle. Jak wydzielisz samo _context.SomeSet.Add(someObject) to to jest właśnie ta niepotrzebna abstrakcja.

Aventus
Jak najbardziej, problem tylko że ludzie często mówią o tym rodzaju abstrakcji - co mialo miejsce i tutaj - a brzmią jakby chodziło o wyabstrachowanie EF w każdym przypadku. To wprowadzanie w błąd.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Wrocław
2
nobody01 napisał(a):

Ludzie piszą, że należy tworzyć warstwę abstrakcji nad bibliotekami, które mogą w przyszłości zostać zamienione na inne. Ale przecież na początku projektu nie wiadomo, czy do biblioteki, której planuje się używać, nie wyjdzie w przyszłości jakaś lepsza alternatywa, więc należałoby pisać abstrakcję do wszystkich, które są używane w wielu miejscach. Jak żyć? :/

Żyć trzeba pragmatycznie. Szanse na zmianę kluczowej w projekcie biblioteki są bliskie zeru. Nawet z "wydzieloną abstrakcją" nikt na to nie pójdzie, bo za duże ryzyko.
Abstrakcje powinny istnieć pomiędzy warstwami aplikacji, a wrapper na bibliotekę to nie jest abstrakcja.

WeiXiao napisał(a):

W ogóle po co ludzie używają Repo jeżeli nierzadko podmiana bazy ogranicza się do podmiany drivera?

Dwa powody:

  1. kult cargo;
  2. zawsze można powiedzieć, że się zna i praktykuje wzorce projektowe.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)