Chciałbym zaprezentować efekt mojej miesięcznej pracy, a mianowicie aplikację systemu głosowania. Jej tematyka może i nie jest zbyt pomysłowa. Jednak zamysł na aplikację wziął się stąd, że chciałem w końcu zaimplementować to słynne DDD "tak jak się należy". Tak, aby mieć szablon na jakieś przyszłe projekty. Po przejrzeniu setek repozytoriów zabrałem się za pracę. Po napisaniu dużej części kodu zorientowałem się, że duża jego część (która jest potrzebna) nie wygląda zbyt ciekawie - różnego rodzaju interfejsy, obsługa CQRS, rejestracje w Autofacu i tym podobne rzeczy. Cały ten kod wyniosłem do osobnych bibliotek, które później nazwałem SharpDomain. Chciałbym usłyszeć opinię o moim projekcie oraz czy takie rozwiązanie ma w ogóle sens (wydzielenie biblioteki DDD pod przyszłe projekty). Czy wszystko zrobiłem zgodnie ze sztuką?
W projekcie wykorzystałem:
- do IoC: Autofac,
- do CQRS: MediatR,
- do walidacji: FluentValidation,
- do mapowania: Automapper,
- do persystencji: własne rozwiązanie "in memory" (czyli właściwie jest tylko symulacja persystencji)
Aplikacja posiada uwierzytelnianie i autoryzację użytkowników (bez hasła, ale to celowo).
SharpDomain - znajduje się tu kod który mi nie pasował w aplikacji docelowej i go wyniosłem do osobnych bibliotek.
SharpDomain.Example - repozytorium zawierające system głosowania. Są tam dwie aplikacje: konsolowa oraz WebApi. Nie mają one ze sobą żadnej interakcji. Są dwie dlatego, że chciałem aplikację odpalić też w postaci konsolowej, a nie tylko w ASP.NET Core. Aplikacja API nie posiada frontendu - tylko Swagger (być może ktoś jest chętny na dodanie?). Aplikacja konsolowa posiada symulowanych głosujących, dlatego liczba głosów może się samoistnie zmieniać.
Kod nie posiada testów - jestem tego w pełni świadomy. Wynika to z tego, że nie poruszam się jeszcze w tym temacie swobodnie. Kod zmieniał się intensywnie i często - nie chciałem tracić czasu na dostosowywanie testów. Z dokumentacją sytuacja wygląda podobnie - nie chciałem ciągle gonić za często zmieniającym się kodem.
Jako ciekawostkę podam, że wrzuciłem te biblioteki na Nugeta i w ciągu miesiąca mam ponad 3000 pobrań. Nie wiem z czego to wynika, wątpię by ktoś ich używał bez jakiejkolwiek dokumentacji. Może jakieś roboty?
Nie wiem czy struktura katalogów jaką wybrałem jest odpowiednia. Mam tu na myśli to, że katalogi są ponazywane na przykład: Commands
, Queries
, Models
. Czy może lepiej pogrupować je według "domeny", na przykład Vote
, Question
i dopiero tam wszystko co związane z danym modelem?
Czekam na waszą opinię. Jak ktoś stwierdzi, że nie takie słabe to ucieszę się z gwiazdki na Githubie.