Dobre praktyki .NET

Dobre praktyki .NET
0
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
0

No to jednak nie repozytorium.

0
somekind napisał(a):
Błękitny Orzeł napisał(a):

Tak chodziło mi o to, że repozytorium operuje na Aggregate roocie.
A jeśli jeden agregat ma w sobie innego?

To wtedy nie jest to DDD, więc nie jest aggregate rootem.

Metoda update robi w zależności od implementacji

  1. Zamienia obiekt w kolekcji w przypadku InMemory

Ale co zamienia? Jeśli jest w pamięci, to wystarczy przecież przypisać nową wartość i już jest zupdatowana.

Tak wiem, że wystarczy zmienić ale chodziło mi o to, że mam interfejs repozytorium i różne implementacje. Więc chcę by serwisy korzystały z kontraktu a implementacje podmieniam.

  1. Wysyła POST do mikroserwisu za pomocą klienta wygenerowanego przez AutoResta - a co dalej się dzieje to nie wiem. Może sql.

Tak od razu? Bez UoW? Bez transakcji? To nie DDD.

Tak. Jakiej transakcji? UoW dla jednego repo?
Wygląda to tak, że otrzymuje request do WebApi stąd wysyłam komendę do Serwisu, który modyfikuje obiekt domenowy i wywołuje metodę update repozytorium.
Po co tutaj UoW i transakcje?

Ogólnie projekt, na którym bazuje w tym temacie to wielka fasada do paru mikroserwisów(z których korzystam tylko ja :P (póki co!! - może kiedyś inny system będzie chciał)) oraz wystawiam WebAPI dla klineta Angularowego.
Powiedziano mi by zrobić to w DDD(więcej napiszę spoza kompa firmowego :P).

Jesteś nowy w tej pracy? Bo może to głupi dowcip dla świeżaka miał być...
No bo jeśli nie, to ktoś tam ewidentnie się z własnym przyrodzeniem na łby pozamieniał. DDD ma zastosowanie w projektach ze skomplikowaną logiką biznesową. Ty masz fasadę, więc nie masz żadnej logiki biznesowej, to jest idealny przykład miejsca, w którym DDD się nie uda nawet na siłę.

Wszystkie solucje/projekty w tym systemie mają być pisane w DDD. Fasada, mikroserwisy, nawet front w TypeScript :P
Oczywiście wygląda to tak, że bez żadnego głębszego szkolenia odnośnie DDD. Po prostu Aggregate Rooty, bez ValueObject bo nie widzimy gdzie by je wcisnąć. CQRS(eventy tylko lokalnie! :P) modyfikuje obiekty domenowe(z projektu Domain) i wywołuje metody repo.

Więc przykryłem metody klienta jedną metodą Update, które wykonywane są w zalezności o typu zdarzenia.
Wydaje mi się, że jest to takie trochę ubogie CQR gdzie manualnie(w kodzie) żągluje zdarzeniami.

Czy to jest dobre repozytorium, które ukrywa źródło danych?

Nie, to nie jest żadne repozytorium. To jest po prostu zwykła fasada.
Ale dobra fasada? :P

Okej, widzę, że dużo mam do nauki.
Repozytorium - jak powinno wyglądać, kiedy to nie jest repo a kiedy jest.
DAO - ??
UoW / transakcje

0

Mam projekty:
Model(modele),
Contracts(viewmodele, interfejsy serwisów),
Application (implementacje serwisów),
Web(widoki i kontrolery).
Gdzie umieścić DbContext, który będę wstrzykiwal do serwisów?

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
0
Błękitny Orzeł napisał(a):

Tak wiem, że wystarczy zmienić ale chodziło mi o to, że mam interfejs repozytorium i różne implementacje. Więc chcę by serwisy korzystały z kontraktu a implementacje podmieniam.

I próbujesz pokonać naturalne działanie języka przy pomocy jakiejś pokrętnej architektury?

Tak. Jakiej transakcji? UoW dla jednego repo?
Wygląda to tak, że otrzymuje request do WebApi stąd wysyłam komendę do Serwisu, który modyfikuje obiekt domenowy i wywołuje metodę update repozytorium.
Po co tutaj UoW i transakcje?

No jak nie ma miejsca na UoW i transakcje biznesowe, to tym bardziej nie ma go na DDD i repozytoria.

Wszystkie solucje/projekty w tym systemie mają być pisane w DDD. Fasada, mikroserwisy, nawet front w TypeScript :P
Oczywiście wygląda to tak, że bez żadnego głębszego szkolenia odnośnie DDD. Po prostu Aggregate Rooty, bez ValueObject bo nie widzimy gdzie by je wcisnąć. CQRS(eventy tylko lokalnie! :P) modyfikuje obiekty domenowe(z projektu Domain) i wywołuje metody repo.

Tylko, że to z DDD nie ma nic wspólnego.

Wielki Młot napisał(a):

Mam projekty:
Model(modele),
Contracts(viewmodele, interfejsy serwisów),
Application (implementacje serwisów),
Web(widoki i kontrolery).
Gdzie umieścić DbContext, który będę wstrzykiwal do serwisów?

Ten Model to co to za modele? Biznesowe czy EF? Bo jak EF, to DbContext równie dobrze możesz mieć tam. A jeśli nie, to do DataAccess albo Infrastructure.

0

@somekind trochę odbiegnę od waszej dyskusji, ale co sądzisz o EF Corze? Osobiście w pracy stosujemy Dappera (jestem juniorem, więc dał mi kopa do skilla w SQL, za co go sobie chwalę), ale z ciekawości popatrzyłem na ten nowy twór EF Core i według kilku benchmarków dorównuje dapperowi.

neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 21 godzin
  • Lokalizacja:Kraków
  • Postów:1114
0
DEFINETRUEFALSE napisał(a):

@somekind trochę odbiegnę od waszej dyskusji, ale co sądzisz o EF Corze? Osobiście w pracy stosujemy Dappera (jestem juniorem, więc dał mi kopa do skilla w SQL, za co go sobie chwalę), ale z ciekawości popatrzyłem na ten nowy twór EF Core i według kilku benchmarków dorównuje dapperowi.

Z tym dorównuje to bym nie przesadzał, różnica ciągle jest spora 343.6 us vs 233.2 us:
https://www.reddit.com/r/csharp/comments/6yhp84/entity_framework_core_20_vs_dapper_performance/
aczkolwiek idzie to zdecydowanie w dobrą stronę, tyle że niestety póki co efc nie wspiera mapowania czystego sql na obiekty inne niż te używane z DBSet<T>, więc raczej bez Dappera się nie obejdzie.


somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
0
DEFINETRUEFALSE napisał(a):

@somekind trochę odbiegnę od waszej dyskusji, ale co sądzisz o EF Corze?

Nic nie sądzę - nie używam Core.

DZ
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:9
0

A dorzucę tu jeszcze jeden materiał (ostrzegam, całkiem to długie), na który się natknąłem z pół roku temu. Spotkałem tego pana kiedyś na szkoleniu, jest MVP Microsoftu, trochę lat robi, chyba najbardziej treściwy tutorial ever jaki spotkałem z ASP.Net Cora mvc ever. Pewnie ludzie bardziej ogarnięci niż ja w środowisku C# kojarzą człowieka. Chociaż jak widzę rozmowę o wzorcu repozytorium to tutaj też możnaby się przyczepić. never mind.

Tutaj tutorial startuje

No i jest z tego repo na githubie

https://github.com/Synergia503/Passenger

Pozdrawiam gorąco z niewywietrzonego biura

GN
A to MVP jest wyznacznikiem czegokolwiek?
marmite
Słuchałem gościa parę razy, wydaje się być sensowny.
somekind
MVP to wyznacznik trochę wiedzy, a trochę medialności i sławy.
a_s_f
też widziałem kilka prezentacji i jak dla mnie merytorycznie jest ok, ale za szybko mówi
marmite
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 4 lata
  • Postów:69
0

Jak korzystać z obiektów DTO? Jeżeli wyciągam całą kolekcję obiektów z repozytorium dobrym podejściem będzie przepisanie tego do DTO w serwisie w pętli?

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
1

Jeśli potrzebujesz DTO, to po co Ci w ogóle jakieś repozytorium i mapowanie, nie prościej od razu wyciągnąć to DTO?

varmanpl
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Kraków
  • Postów:60
0

Co myślicie o logice aplikacji w bazie? Mam na myśli if'y, case'y w procedurach. Z tego co widzę i słyszę nie jest to rzadkie zjawisko w .NET.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
3

Ta choroba dotyczy ludzi, którzy zatrzymali się w rozwoju w latach osiemdziesiątych. Każdy zdrowo myślący człowiek woli pisać kod, który się da łatwo testować, debugować i wersjonować, SQL takim nie jest.

neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 21 godzin
  • Lokalizacja:Kraków
  • Postów:1114
1

Na upartego da się i wersjonować i testować i debugować (przynajmniej mssql) logikę trzymaną w bazie, no ale powinna to być wyłącznie ostateczność, wtedy i tylko wtedy kiedy mamy co najmniej rząd wielkości pod względem wydajności do zyskania w stosunku do logiki trzymanej w kodzie. Bo logikę trzymaną w kodzie znacznie łatwiej utrzymać.


edytowany 2x, ostatnio: neves
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)