Logowanie dla leniwych

Nie lubię logowania

Nie lubię logowania — brudzi mi w kodzie; narzekam, gdy podczas ratowania produkcji brak logów — jak żyć?!

Jestem leniwy, nie lubię pamiętać o tym i tamtym — lubię, gdy rzeczy dzieją się same i nie muszę sobie zawracać tym głowy. Ale bez przesady! Logi to najgorsze i najlepsze co może spotkać programistów — z jednej strony logi zaśmiecają kod, z drugiej strony dają podgląd na to, co użytkownicy wymyślili na produkcji.

AOP

Logowanie przy pomocy AOP oczyszcza kod w przypadku typowego i klasycznego podejścia do logów, ok — może to zrobić. Często szukam w logach tego, co zostało uruchomione i z jakim parametrem, aby zrozumieć, co poszło nie tak. Nie lubię ^C^V takiego kodu na początku każdej metody. Niestety nie znalazłem dobrego rozwiązania AOP (czytaj darmowego) a interfejs IIntercept z jakiegoś powodu nie chce zostać uruchomiony (ale jest tworzony — kiedyś to zrozumiem); z tego powodu przy pomocy internetów znalazłem DispatchProxy które świetnie robi swoją robotę.

DispatchProxy

Otóż chciałbym mieć możliwość logowania tego, co i jak się wywołuje z możliwością włączenia / wyłączenia detali (poziomy logowania w moim przypadku, lub inna forma konfiguracji). Chce móc przeczytać logi i dowiedzieć się co się wywołuje i z jakim parametrami, dla każdej metody, dodatkowo bez potrzeby modyfikacji kodu, gdy dana metoda się zmieni.

Można to zrobić przy pomocy DispatchProxy które przechwyci wywołanie metody i umożliwi wykonanie dowolnego kodu; przed; po czy też podczas błędu.

Otóż taka klasa opina ładnie swoją docelową klasę T , a następnie podczas tworzenia zwraca takie proxy, udając klasę typu podstawowego. Tutaj uwaga: konstruktor musi być pusty, a ewentualne przekazanie parametrów i ich  przypisanie następuje w metody fabrykującej (wewnątrz if)

Gdy użytkownik takiej klasy wywołuje metodę docelową, na proxy wcześniej zostanie zawołane Invoke gdzie można czynić cuda.
Ja na przykład na poziomie `Information` loguje nazwę wywoływanej metody, a na poziomie Debug dorzucam także nazwy i wartości przekazanych argumentów.

Rejestracja

Piękne jest to, że DispatchProxy nie wymaga zewnętrznych bibliotek i działa na czysto z .net. Zależność do klasy rejestruje w taki sposób:

Akcja

Działa to tak:

Tutaj przykład konsumpcji oraz wykorzystania przykładowego serwisu

A tutaj logi:

Serwis jest nudny do bólu i prawie o nim zapomniałem:

Siup

W tak przygotowanym kodzie, zależności rejestrowane z pomocą logera powinny samodzielnie wrzucać informację o tym, co i jak się wykonało. Oczywiście można dodać sobie flagi do optymalizacji tego, czy przed, czy po co w sytuacjach wyjątkowych ma się logować i na jakim poziomie. Warto także pomyśleć o tym, jak takie logi ze sobą łączyć za pomocy correlationId – ale to pozostawiam już waszej wyobraźni.

 

ps.
dzisiaj bez obrazka

Zaślepić HttpClient

Zajawnik / Reklama

Testy jednostkowe to dobra sprawa – to oczywista oczywistość. Można o nich sporo pisać, można zobaczyć też co ja o nich piszę/mówie na udemy (https://www.udemy.com/course/wprowadzenie-do-testowania-dla-programistow-net/learn/lecture/13612678#overview) albo na kursy.jaroslawstadnicki.pl.

Czasem jednak chce się więcej, to że testy są na zielono nie oznacza jeszcze, że wszytko działa.

Tylko w ruscie, jak się skompilowało to można na proda wrzucać 😉

Integrować się chce

No ale ale, chce napisać, że marzy mi się taka sytuacja, że mogę sobie odpalić i szybko przetestować cały kod (prawie cały) od wejścia do zapisu. Większość rzeczy, z którymi pracuje, albo zaczyna się na http, albo kończy się na http, a ja nie chce nigdzie strzelać, chce to zaślepić i mieć pod kontrolą — jak?!

Continue reading

tu ma być spacja

Zamarudziłem ostatnio na twiterze, że przestałem lubić code review:

To nie pierwszy raz, kiedy marudzę, nie pierwszy raz, kiedy na Twitterze i nie pierwszy raz o tym, że komentarze na temat spacji, wcięć, klamerek i całej serii białych znaków to czyste 💩

Ile jeszcze? Otóż dorosłem 👴 i chce coś z tym zrobić. Można na różne sposoby, ja wybrałem .editorconfig – bo jest wspierany z pudełka przez większość edytorów

Oczywiście moje życie mówi sprawdzam! i jest trochę inaczej, ale ostatecznie można to ogarnąć.

Continue reading

VSA – nTier

Jak zacząć? Czym się różni wróbelek? Tym, że ma jedną nóżkę bardziej? I myślę, że VSA różni się tak samo od nTier, że ma warstwę bardziej. Myślę, że bardziej czytelny będzie, choć oderwany od prawdziwego życia, choć myślę, że mógłby być smaczny. Otóż nTier to taki klasyczny tort, biszkopt, masa, biszkopt, smak, biszkopt, masa, biszkopt – gdzie przeplataniec może być w dowolnej kolejności, a smak do ustalenia z kucharze. Cała idea jest taka, że gdzie i jak nie ukroisz to będzie tak samo (plus losowość wystrojenia na topie). A teraz wyobraź sobie, że, w zależności od twoich potrzeb tort może mieć wiele smaków, i wiele ułożeń i smaków. Dla Ciebie będzie kawowy, dla żony likier, dla dziecka truskawka, dla cioci lawenda 😉 etc etc – a jeszcze najpiękniejsze jest to, że tory będzie wyglądać tak samo jak każdy inny – jak tort. Możesz nawet poprosić, aby dekoracja pasowała i podpowiadała smaki.

Czemu w ogóle o tym piszę, skoro się tak bardzo nie różnią? Ta drobna różnica daje dużą elastyczność, która to z kolei ułatwia i upraszcza proces tworzenia rozwiązywania problemów biznesowych. Jeszcze, to co dla mnie ważne ostatnio, to dedykowany kod, brak wspólnego mianownika, brak 🤮 dziedziczenia, brak reużywalności – w którą przestałem wierzyć. Każda linijka dedykowana tylko jednej konkretnej funkcjonalności.

Przypomnij sobie podejście kontroler, manager, serwis, repozytorium i z powrotem 🔁 – byle do piątku, byle do emerytury…
A teraz wyobraź sobie, że obowiązkowy jest tylko kontroler czy jakiś inny endpoint, reszta zależy tylko od Ciebie i tego co właściwie potrzeba. Bo świat jest piękny gdy każdy jest inny, a wszystko działa tak – jak powinno.

 

Wspólne modele dla dotnet i typescript

Trawa za płotem bardziej zielona

W Blazor’ze bardzo podoba mi się to, że brane są modele z dotnet (czy to api, czy to dowolna warstwa) i że każda zmiana na “backendzie” za darmo i od razu dostępna na “froncie”. Typescript ma fajne to, że można sobie silnie typować obiekty i że ten javascript jest takie ciut pewniejszy. Angular dla mnie mocno przypomina MVC więc z niego korzystam – ale! Jestem dobry w narzekanie; ale nie ma tego co ma blazor – a ja bym chciał. Bo takie przepisywanie modeli z dotnet na typescript to jest nudne, coś zmienisz, albo machniesz literówkę i trzeba szukać. Lubię też się wyręczać robotą kogoś innego 😉

google is your friend

Także poszukałem jak to ogarnąć. Co? No to, jak z klas w dotnet generować  klasy / kod do typescript, który można potem wykorzystać w projekcie na froncie.

Continue reading