staram się zachować rzeczy bardzo proste, kiedy mogę, więc zazwyczaj coś jak to działa na mnie:
Myapp.Domain - zajęcia szczególne wszystkich domen dzielić tej przestrzeni nazw
Myapp.Data - cienka warstwa, która streszcza bazę danych z domeny.
Myapp.Application - Wszystkie "Kod wsparcie", rejestrowanie, wspólny kod narzędzie konsumenci usług itp
Myapp.Web - UI web
Więc zajęcia będą na przykład:
- Myapp.Domain.Sales.Order
- Myapp.Domain.Sales.Customer
- Myapp.Domain.Pricelist
- Myapp.Data.OrderManager
- Myapp.Data.CustomerManager
- Myapp.Application.Utils
- Myapp.Application.CacheTools
Etc.
Pomysł staram się pamiętać, jak idę po to, że przestrzeń nazw „domeny” co przechwytuje rzeczywiste logiki aplikacji. Więc co tam można porozmawiać z "ekspertami domeny" (The Dudes, którzy będą korzystać z aplikacji) o. Jeśli koduję coś z powodu czegoś, o czym wspomnieli, powinno ono znajdować się w przestrzeni nazw domeny, a kiedy koduję coś, czego nie wymienili (jak rejestrowanie, śledzenie błędów itp.), NIE powinno być w obszarze nazw domeny.
Z tego powodu nie podoba mi się zbytnie skomplikowanie hierarchii obiektów. Idealnie uproszczone rysowanie modelu domeny powinno być intuicyjnie zrozumiałe dla osób niebędących programistami.
W tym celu zwykle nie zaczynam od myślenia o wzorach bardzo szczegółowo. Staram się modelować domenę tak prostą, jak to tylko możliwe, kierując się tylko standardowymi wytycznymi projektowymi zorientowanymi obiektowo. Co musi być przedmiotem? W jaki sposób są one powiązane?
DDD w moim umyśle dotyczy obsługi złożonego oprogramowania, ale jeśli twoje oprogramowanie nie jest na początku zbyt skomplikowane, możesz łatwo znaleźć się w sytuacji, w której sposób działania DDD zwiększa złożoność, a nie ją usuwa.
Po uzyskaniu pewnego poziomu złożoności w modelu można rozpocząć, aby zobaczyć, jak pewne rzeczy powinny być zorganizowane, a wtedy będziesz wiedzieć, jakie wzorce do wykorzystania, które klasy są agregaty itp
w moim przykładzie , Myapp.Domain.Sales.Order byłby zbiorczym katalogiem głównym w tym sensie, że w przypadku wystąpienia będzie prawdopodobnie zawierał inne obiekty, takie jak obiekt klienta i kolekcja wierszy zamówienia, a ty uzyskasz dostęp tylko do linii zamówienia dla tego konkretnego zamówienie za pośrednictwem przedmiotu zamówienia.
Jednak, aby zachować prostotę, nie miałbym obiektu "wzorcowego", który zawiera tylko wszystko inne i nie ma innego celu, więc klasa zamówień będzie sama mieć wartości i właściwości, które są użyteczne w aplikacji.
Więc będę odwoływać się takie rzeczy jak:
Myapp.Domain.Sales.Order.TotalCost
Myapp.Domain.Sales.Order.OrderDate
Myapp.Domain.Sales.Order.Customer .PreferredInvoiceMethod
Myapp.Domain.Sales.Order.Customer.Address.Zip
itp
ma sens ... Porządek i klienta są ci AggRoots prawda? Więc kiedy odwołujesz się do przedmiotu zamówienia, musisz zrobić to jak: Myapp.Domain.Sales.Order.Order ?? –
Tak i nie - trochę rozszerzyłem mój przykład, ponieważ sekcja komentarzy jest trochę za krótka. – Console
'Klasy' Manager' w przestrzeni nazw 'Data' sprawiają, że jestem anemicznym modelem. –