Z reguły naszą logikę biznesową umieszczamy w klasach serwisowych. Czasem są one większe, a czasem mniejsze. Zastanówmy się, jak mógłby wyglądać nasz kod, gdybyśmy dla każdej metody z serwisu tworzyli osobną klasę. Wykorzystamy do tego bibliotekę MediatR. Jeśli ktoś się zastanawia po co, odpowiedź jest prosta: aby zwiększyć spójność i zmniejszyć sprzężenie. Na razie nie będziemy się zagłębiać w takie pojęcia jak CQRS czy CQS. Naszym celem jest rozbicie klas na mniejsze i zmiana tego, jak je wołamy. Po ty...
Strona głównaUżytkownik
Admu | użytkownik
Sztuka programowania 1450 dni, 4 godziny, 22 minuty temu 138 źrodło rozwiń
Jakiś czas temu pisałem o tym, że gdy tworzymy API, warto dodać narzędzie Swagger. Umożliwia ono w szybki i prosty sposób przetestować nasze API (tutaj). Zdarza się jednak tak, że aby móc korzystać z naszego API, dane żądanie (request) musi być zautoryzowane, czyli np. posiadać odpowiedni token. Swagger umożliwia autoryzację żądań na wiele sposobów. W tym poście opiszę jak to zrobić, gdy potrzebujemy Bearer token.
Z reguły nasze aplikacje posiadają jakąś logikę biznesową (o ile nie piszemy prostego CRUD). Chciałbym jednak zaznaczyć, że nie mam tu na myśli logiki w rozumieniu walidacji czy reguł biznesowych, np. brak możliwości zmiany wartości jakiegoś pola, gdy pewne warunki nie zostaną spełnione. Chodzi mi bardziej o logikę procesu, np. gdy klient złoży zamówienie, musimy mu wysłać wiadomość e-mail. Ta logika nie dotyczy obiektu zamówienia, ale jest z nim związana. Skoro wiemy, że będziemy musieli przechowywać g...
Sztuka programowania 1499 dni, 5 godzin, 44 minuty temu 132 źrodło rozwiń
Ostatnio pisałem o tym, co możemy zrobić, gdy nasze metody zwracają rezultat i chcemy go zmapować na odpowiedni kod http (tutaj). W tym poście podam podobne rozwiązanie, gdy nasze metody rzucają wyjątki, zamiast zwracać rezultat.
Jakiś czasem temu pisałem o tym, że nasze metody mogą zwracać rezultat lub zgłaszać wyjątek (tutaj). Zastanówmy się, jak mogłoby wyglądać nasze API, aby status rezultatu był mapowany na odpowiedni kod Http. Mamy dwie możliwości: wspólna metoda w klasie bazowej lub filtr.
Jakiś czas temu pisałem o testach w kontekście API (tutaj). W tym poście postaram się opisać jak napisać podobne testy, ale gdy nasza aplikacja komunikuje się poprzez kolejkę. Pokaże to z wykorzystaniem biblioteki MassTransit.
Często w naszych aplikacjach mamy do czynienia z datami. Najczęściej używamy ich przy polach takich jak data utworzenia (np. CreatedAt) lub data modyfikacji (np. ModifiedAt), ale są też inne miejsca. Wtedy z reguły stosujemy DateTime.UtcNow. Niestety w testach ciężko jest potem coś z taką datą zrobić. Nie mamy żadnej możliwości ustawienia tej daty na jakąś inną, aby przetestować czy nasza aplikacja działa poprawnie. Sprawa się jeszcze bardziej komplikuje, gdy mamy logikę biznesową uzależnioną od takiej ...
Kiedyś bardzo lubiłem bibliotekę AutoMapper. Była ona z reguły jedną z pierwszych bibliotek, jakie zawsze dodawałem do projektu na samym początku. Pozwalała mi tworzyć mnóstwo obiektów i mapować je do woli, poświęcając na to niewiele czasu „programistycznego”. Była świetna! Aż do momentu, gdy zaczęła być jedną z największych bolączek.
Sztuka programowania 1618 dni, 5 godzin, 22 minuty temu 262 źrodło rozwiń
Często gdy mamy napisać jakiś kod, okazuje się, że już gdzieś napisaliśmy taki sam lub podobny. Wtedy stajemy przed dylematem – czy zduplikować go, czy użyć ponownie?
Sztuka programowania 1632 dni, 5 godzin, 43 minuty temu 131 źrodło rozwiń
Z reguły gdy tworzymy jakąś aplikację jest to jedna wielka aplikacja albo zbiór małych aplikacji, które w mniejszym lub większym stopniu się ze sobą komunikują. Ponadto często jest tak, że architektura większości z nich jest dokładnie taka sama. Czy to aby na pewno dobre podejście?
Architektura 1645 dni, 20 godzin, 26 minut temu 143 źrodło rozwiń
General Responsibility Assignment Software Patterns (GRASP) to zbiór 9 zasad określających, jaką odpowiedzialność powinno się przypisywać określonym obiektom i klasom w systemie. Wszystkie te zasady odpowiadają na część problemów z oprogramowaniem, które są wspólne dla prawie każdego projektu. Techniki te nie zostały wymyślone w celu stworzenia nowych sposobów pracy, a jedynie w celu lepszego udokumentowania oraz standaryzacji starych, wypróbowanych i przetestowanych zasad programowania. Jest więc to kol...
Sztuka programowania 1659 dni, 5 godzin, 21 minut temu 63 źrodło rozwiń
Na przestrzeni lat powstało bardzo dużo projektów. Część z nich była łatwiejsza w utrzymaniu, część trudniejsza. Analiza tych projektów pozwoliła zauważyć, że są pewne zasady, które powodują łatwiejszy ich rozwój. Te zasady zostały połączone w zbiory zasad. Najbardziej popularnym i powszechnie stosowanym zbiorem zasad jest SOLID. Postaram się opisać te zasady z pragmatycznego punktu widzenia.
Architektura 1674 dni, 20 godzin, 22 minuty temu 91 źrodło rozwiń
Gdy tworzymy jakieś API dobrze jest sprawdzić, czy ono działa. Po każdej zmianie albo dodaniu nowego punktu wejścia (endpoint) powinniśmy przetestować, czy wszystko jest ok. Możemy to zrobić uruchamiając aplikację i ręcznie wszystko sprawdzając, jednakże na dłuższą metę jest to bardzo czasochłonne. Dlatego warto utworzyć osobny projekt, w którym stworzymy testy sprawdzające czy nasze API działa poprawnie. W kilku punktach postaram się opisać jak u mnie z reguły wygląda taki projekt z testami API.
Jak dużo czasu poświęcacie na zrozumienie kodu, gdy trzeba w nim coś zmienić? Czasem kod jest na tyle czytelny, że wszystko widać od razu, a czasami trzeba poświęcić po kilka-kilkanaście godzin, aby zrozumieć co się w nim dzieje. Z czego to wynika? Mam kilka przemyśleń na ten temat.
Sztuka programowania 1688 dni, 5 godzin, 39 minut temu 75 źrodło rozwiń
Czy mieliście czasem wrażenie, że wraz z upływem czasu, kod w projekcie staje się coraz gorszy? Że się starzeje? Że jest coraz trudniejszy w utrzymaniu? Że pojawia się coraz więcej miejsc gdzie został zaciągnięty dług techniczny i nie został on potem spłacony? Albo może mieliście w swoich projektach takie miejsca, których nikt nie chciał dotykać? Wyglądały strasznie i każdy się bał, że gdy coś tam zmieni, to coś innego wybuchnie? Zapewne cześć tego kodu została napisana przez nas, część przez naszych ko...
Sztuka programowania 1695 dni, 5 godzin, 29 minut temu 81 źrodło rozwiń
Często słyszę, jak te pojęcia są mylone i używane zamiennie, a tak naprawdę tyczą się zupełnie różnych rzeczy. Pokrótce postaram się przybliżyć oba te terminy, a także zaproponować sposób, jak z nimi żyć.
Architektura 1702 dni, 4 godziny, 26 minut temu 51 źrodło rozwiń
Spotkałem już kilka nazw, a każda z nich wskazywała na tę samą architekturę. Różniły się one co prawda tym, jak był rysowany wykres zależności, ale idea była taka sama. Ogólnie mówiąc, ta architektura wydaje się czymś naturalnym, a mimo wszystko jest wciąż dość rzadko spotykana. Czym się wyróżnia? Tak w skrócie, to w tej architekturze najważniejsza jest logika biznesowa, tzw. „Core” aplikacji. Jest tam zdefiniowane wszystko to, co jest niezbędne dla działania. Wszystko inne jest implementowane w oddziel...
Architektura 1716 dni, 4 godziny, 37 minut temu 151 źrodło rozwiń
Czy byliście kiedyś w sytuacji, że dołączyliście do istniejącego już projektu, zagłębiliście się w jego kod i architekturę, a następnie uznaliście, że to jest bez sensu? Że ktoś dał mocno ciała wybierając architekturę pod projekt albo podejmując inne ważne decyzje? Jednak nie macie kogo o to spytać, bo żadna z osób, które podejmowały te decyzje, już w tym projekcie nie pracuje? Może nawet postanowiliście zrobić refaktoryzację i po kilku godzinach/dniach okazało się, że jednak początkowe rozwiązanie było ...
Architektura 1722 dni, 4 godziny, 37 minut temu 83 źrodło rozwiń
Gdy piszemy metodę, która ma coś wykonać i ta operacja się nie powiedzie, zastanawiamy się co w takiej sytuacji zrobić: czy lepiej jest rzucić wyjątek, czy może zwrócić rezultat z odpowiednim statusem? Przyjrzyjmy się obu rozwiązaniom.
Architektura 1731 dni, 5 godzin, 6 minut temu 155 źrodło rozwiń
W poprzednim poście pisałem o bibliotece FluentValidation i jak ją dodać do naszego projektu. W tym poście skupimy się na bardziej zaawansowanych funkcjonalnościach, jakie nam ta biblioteka udostępnia: - Walidacja złożonych właściwości (manualna i automatyczna) - Wspólny walidator właściwości - Walidacja listy - Własny komunikat błędu walidacji - Wspólne walidatory - Warunki walidacji - Reguły zależne od siebie - Wywołanie zwrotne - Asynchroniczna walidacja