.NET Domain-Driven Design with C# - książka, opinie

0

Tytuł: .NET Domain-Driven Design with C#: Problem - Design - Solution
Autor: Tim McCarthy

link: http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470147563.html

Witam

Może ktoś przejrzeć/sprawdzić jakość kodów dołączonych jako przykłady do tej książki? I ogólnie ocenić jakość tej książki?

Trafiłem na tą książkę szukając czegoś do nauki jak zaprojektować i napisać aplikację biznesową dla paru (max kilkunastu) osób. Przeglądając ją trochę widzę że jest dla mnie zrozumiale napisana (zrozumiały angielski) ale nie umiem ocenić samego podejścia i jakości rozwiązań problemów stawianych na początku każdego rozdziału.
Wstępnie mam przygotowanych parę programików korzystających już z baz danych i ułatwiających pracę ale nadal nie mogę ogarnąć i podejść z dobrą architekturą do programu korzystającego z jednej bazy danych i z którego korzysta pare osób nie psując danych w bazie danych sobie nawzajem. Czy pod kątem takiego spajania kilku programów w jeden dla paru osób to dobra książka?

Wcześniej, aby ogarnąć podejście do architektury takich aplikacji biznesowych, próbowałem od zapoznania się z wzorcami projektowymi Martina Fowlera "Architektura systemów zarządzania przedsiębiorstwem. Wzorce projektowe" ale jako sucha lektura ze zbyt małą ilością kodu ta książka była dla mnie zbyt abstrakcyjna. Może właśnie w połączeniu z tą ".NET DDD with C#" będą się dobrze uzupełniały? Ale tego też nie potrafię sam ocenić.

1
Varran napisał(a):

Trafiłem na tą książkę szukając czegoś do nauki jak zaprojektować i napisać aplikację biznesową dla paru (max kilkunastu) osób. Przeglądając ją trochę widzę że jest dla mnie zrozumiale napisana (zrozumiały angielski) ale nie umiem ocenić samego podejścia i jakości rozwiązań problemów stawianych na początku każdego rozdziału.

Na pewno przeczytanie książki o DDD Ci nie zaszkodzi.

Niemniej jednak, DDD nie zawsze jest dobrym pomysłem, w szczególności do prostych CRUDowych aplikacji moim zdaniem to jest nadmiarowe.

Wstępnie mam przygotowanych parę programików korzystających już z baz danych i ułatwiających pracę ale nadal nie mogę ogarnąć i podejść z dobrą architekturą do programu korzystającego z jednej bazy danych i z którego korzysta pare osób nie psując danych w bazie danych sobie nawzajem.

Jeśli masz problem ze współbieżnością, to do tego nie trzeba książki. Poszukaj w Google o optimistic i pessimistic concurrency.

Czy pod kątem takiego spajania kilku programów w jeden dla paru osób to dobra książka?

To jest książka o tworzeniu nowych aplikacji zgodnie z zasadami DDD, nie spajania kilku programów w jeden... (jakkolwiek to rozumieć).

0
somekind napisał(a):

(...) DDD nie zawsze jest dobrym pomysłem, w szczególności do prostych CRUDowych aplikacji moim zdaniem to jest nadmiarowe.

Tak czytałem o tym, ale chyba w moim przypadku nie będzie to raczej prosta aplikację CRUDową. CRUDowe aplikacje kojarzą mi się z szablonem, okno główne z DataGridView gdzie jest zbiór jakiś obiektów np. zlecenia, pracownicy, wyroby itp. i dodatkowo otwieranym/wydzielonym oknem do tworzenia edycji pojedynczych obiektów. i takie pary na zbiór i add/edit tworzone są dla każdego rodzaju encji.
Ja mam plan pracować na takich parach zbiorów CRUD ale i na czymś co w DDD chyba nazywa się agregatem jakiejś encji. Czyli jeżeli taka kalkulacja wyrobu produkcyjnego składa się z listy materiałowej i marszruty technologicznej oraz z listy osób: autor , sprawdzający, zatwierdzający (z datami) oraz z listą na wszystkie poprzednie kalkulacje do tego wyrobu, to ja nie chce zagnieżdzać się w coraz głębsze pary lista/wykaz oraz add/edit encji, tylko działać bezpośrednio na agregacie który odwzorowywałby wpływ na te encje z którymi jest powiązany (sporo system musiałby pilnować, np. edytując w agregacie kalkulacji jakieś czynności elementarne, system miałby sam podbijać wyżej wersje danej czynności elementarnej ale i operacji technologicznej w której jest ta czynność, marsztury w której jest ta oparacja i finalnie kalkulacji w której jest ta marszruta - szaleństwo ;) ale tak to działa dobrze w excelu i chce to przenieść do systemu)

Jeśli masz problem ze współbieżnością, to do tego nie trzeba książki. Poszukaj w Google o optimistic i pessimistic concurrency.

Tak czytałem o tych podejściach optymistycznym lub pesymistycznym ale jakoś mi nie pasuje. Interesuje mnie bardziej taka praca aby w przypadku jeżeli jeden człowiek edytuje jakiś agregat i coś zmienia to aby ten agregat był zablokowany do edycji przez innych oraz aby Ci inni chcąc również edytować ten zablokowany agregat mieli informację kto go teraz edytuje/blokuje. Poza tym nie czuję za bardzo przypadku gdy dwie osoby tworzą jakiś nowy agregat/encję a system ma automatycznie inkrementować sygnaturę, oznaczenie lub coś innego dla tego nowego agregatu. Jakoś nie ogarniam przypadku aby dwie osoby przypadkiem nie zdefiniowały dwa razy tego samego, jak system miałby to uniemożliwiać. Chodzi o przypadek UnitOfWork, gnie coś tworzę narobię się przy tym sporo czasu (złożyć taką kalkulację to nawet pare godzin) ale dopóki to tworzę to system nie zapisuje tego w bazie, dopiero po zakończeniu pracy aktualizuje to wszystko i dopiero mi się zapisuje w bazie danych.

To jest książka o tworzeniu nowych aplikacji zgodnie z zasadami DDD, nie spajania kilku programów w jeden... (jakkolwiek to rozumieć).

Po pierwszym rozdziale to raczej książka z którą przerabia się przypadek pisania aplikacji która wcześniej działała na Accessie, na nowo. poza tym w niej jeszcze facet chyba pisze ręcznie ORM'a, bo stąd chyba te wszystkie klasy typu:

 
public static class RepositoryFactory
public class RepositorySettings : ConfigurationSection
public sealed class RepositoryMappingElement : ConfigurationElement
internal static class RepositoryMappingConstants
public sealed class RepositoryMappingCollection : ConfigurationElementCollection

public interface IRepository<T> where T : EntityBase
public interface IUnitOfWorkRepository
public abstract class RepositoryBase<T> : IRepository<T>, IUnitOfWorkRepository where T : EntityBase

tego też nie za bardzo ogarniam, ale chyba to właśnie część odpowiadająca za mapowanie.

1
Varran napisał(a):

Tak czytałem o tym, ale chyba w moim przypadku nie będzie to raczej prosta aplikację CRUDową. CRUDowe aplikacje kojarzą mi się z szablonem, okno główne z DataGridView gdzie jest zbiór jakiś obiektów np. zlecenia, pracownicy, wyroby itp. i dodatkowo otwieranym/wydzielonym oknem do tworzenia edycji pojedynczych obiektów. i takie pary na zbiór i add/edit tworzone są dla każdego rodzaju encji.

Z grubsza masz rację. :)

Ja mam plan pracować na takich parach zbiorów CRUD ale i na czymś co w DDD chyba nazywa się agregatem jakiejś encji. Czyli jeżeli taka kalkulacja wyrobu produkcyjnego składa się z listy materiałowej i marszruty technologicznej oraz z listy osób: autor , sprawdzający, zatwierdzający (z datami) oraz z listą na wszystkie poprzednie kalkulacje do tego wyrobu, to ja nie chce zagnieżdzać się w coraz głębsze pary lista/wykaz oraz add/edit encji, tylko działać bezpośrednio na agregacie który odwzorowywałby wpływ na te encje z którymi jest powiązany (sporo system musiałby pilnować, np. edytując w agregacie kalkulacji jakieś czynności elementarne, system miałby sam podbijać wyżej wersje danej czynności elementarnej ale i operacji technologicznej w której jest ta czynność, marsztury w której jest ta oparacja i finalnie kalkulacji w której jest ta marszruta - szaleństwo ;) ale tak to działa dobrze w excelu i chce to przenieść do systemu)

No to faktycznie jest coś, w czym podejście DDD ma sens.

Interesuje mnie bardziej taka praca aby w przypadku jeżeli jeden człowiek edytuje jakiś agregat i coś zmienia to aby ten agregat był zablokowany do edycji przez innych oraz aby Ci inni chcąc również edytować ten zablokowany agregat mieli informację kto go teraz edytuje/blokuje.

I to jest właśnie pessimistic concurrency.

Poza tym nie czuję za bardzo przypadku gdy dwie osoby tworzą jakiś nowy agregat/encję a system ma automatycznie inkrementować sygnaturę, oznaczenie lub coś innego dla tego nowego agregatu.

Odpowiedź jest w pytaniu - automatycznie. :)
Jeśli tworzysz ten nowy agregat przez repozytorium, to raczej nie ma problemu w tym, żeby taką sygnaturę pilnować i automatycznie ją numerować. Generowanie numerów warto wtedy wydelegować do oddzielnej strategii, aby móc łatwo zmieniać zasady numeracji.

Jakoś nie ogarniam przypadku aby dwie osoby przypadkiem nie zdefiniowały dwa razy tego samego, jak system miałby to uniemożliwiać. Chodzi o przypadek UnitOfWork, gnie coś tworzę narobię się przy tym sporo czasu (złożyć taką kalkulację to nawet pare godzin) ale dopóki to tworzę to system nie zapisuje tego w bazie, dopiero po zakończeniu pracy aktualizuje to wszystko i dopiero mi się zapisuje w bazie danych.

Rozwiązania tego problemu nie znajdziesz w żadnej książce.
Skoro obiekt jest długotrwały w edycji, to i tak na początku należałoby zablokować jakiś numer dla niego (np. tworząc nowy rekord w tabeli przechowującej wykorzystane numery). Ale i tak najważniejsza jest odpowiedź na pytanie - co to znaczy "zdefiniować dwa razy to samo"? Jak program ma rozpoznać, że dwie osoby robią to samo, według jakich kryteriów?

poza tym w niej jeszcze facet chyba pisze ręcznie ORM'a, bo stąd chyba te wszystkie klasy typu:

Z tego co widzę, to tam się dzieje jakieś magiczne cachowanie repozytoriów. Nie mam pojęcia po co, ale to generalnie nie wygląda na dobry pomysł. Generalnie repozytoria mają ukrywać ORMa, który sam powinien zajmować się cachowaniem niektórych encji. Tylko EF chyba tego nie obsługuje sam z siebie.

0

Dzięki za podpowiedzi, a jeszcze jedno - to cachowanie repozytoriów. Czy to jak to wygląda, może wynikać z wymogu dla tej aplikacji książkowej, w którym autor stawia sobie za cel aby aplikacja pracowała również offline. Tzn bez dostępu do głownej bazy danych, pracować na lokalnej kopii bazy (MS SQL CE) a po odzyskaniu/uzyskaniu dostępu do główej bazy danych żeby te bazy się automatycznie aktualizowały. Porównuje to do stylu pracy z MS Qutlook.

1

Czytanie takich staroci w celu zdobycia jakiś wskazówek co do samej implementacji to chyba kiepski pomysł;p Zauważ że książka ma już 7 lat. Jeśli chodzi o podejście DDD to wykorzystują je autorzy tej książki: http://www.amazon.co.uk/Microsoft-NET-Architecting-Applications-Enterprise/dp/0735685355/ref=sr_1_1?ie=UTF8&qid=1422641497&sr=8-1&keywords=microsoft+architecture+.net
Sporo lania wody, ale ogólnie nie jest źle. Do wersjonowania danych w bazie warto pomyśleć o wzorcu Event Sourcing z CQRS.

1 użytkowników online, w tym zalogowanych: 0, gości: 1