2009-02-09 14 views
25

Zacząłem uczyć się o DDD i chciałem dowiedzieć się, jak inni zorganizowali swoje projekty.Jak zorganizować projekt graficzny oparty na domenie?

zacząłem się organizując wokół moich AggregateRoots:

MyApp.Domain (nazw dla modelu domeny)

MyApp.Domain.Product
- Produkt
- IProductService
- IProductRepository
- itp.

MyApp.Domain.Comment
- Komentarz
- ICommentService
- ICommentRepository
- etc

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository: IProductRepository
- itp.

Problem, który napotkaliśmy, polega na tym, że muszę odwoływać się do produktu mojej domeny jako MyApp.Domain.Product.Product lub Product.Product. Dostaję także konflikt z moim modelem danych linq dla produktu .... Muszę użyć brzydkich linii kodu, aby rozróżnić te dwa, takie jak MyApp.Domain.Product.Product i MyApp.Respoitories.Product.

Jestem bardzo zainteresowany, aby zobaczyć, jak inni organizują swoje rozwiązania dla DDD ...

Używam Visual Studio jako mój IDE.

Wielkie dzięki.

Odpowiedz

19

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

+0

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 ?? –

+0

Tak i nie - trochę rozszerzyłem mój przykład, ponieważ sekcja komentarzy jest trochę za krótka. – Console

+0

'Klasy' Manager' w przestrzeni nazw 'Data' sprawiają, że jestem anemicznym modelem. –

0

Twoja domena prawdopodobnie ma nazwę , więc powinieneś używać tej nazwy jako nazwy przestrzeni nazw: .

I usally umieścić repozytorium wdrożeniowe i dostępu do danych szczegółów w przestrzeni nazw Trwałość pod nazw domen.

Aplikacja używa własnej nazwy jako przestrzeń nazw.

5

I jak mające domenę w nazw głównego zastosowania w jego własnym zespole:

Acme.Core.dll [obszar nazw: Acme]

to starannie stanowi fakt, że domena jest w zakresie wszystkich inne części aplikacji. (Aby uzyskać więcej informacji, zobacz: The Onion Architecture autorstwa Jeffrey Palermo).

Następnie mam zestaw danych (zwykle z NHibernate), który odwzorowuje obiekty domeny na bazę danych. Warstwa ta implementuje repozytorium i usług interfejsy:

Acme.Data.dll [nazw root: Acme.Data]

Wtedy, mam zespół prezentacji uznającą elementy mój UI-pattern-of-wyboru:

Acme.Presentation.dll [nazw root : Acme.Presentation]

Wreszcie istnieje projekt interfejsu użytkownika (zakładając tu aplikację internetową). To gdzie skład pierwiastków w poprzednich warstw zajmuje miejsce:

Acme.Web [nazw root: Acme.Web]

0

bym sprawdzić codecampserver od konfiguracji jest dość powszechne.

Mają projekt podstawowy, w którym zawierają zarówno warstwę aplikacji, jak i domeny. To znaczy. wnętrze cebuli (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/).

Tak naprawdę lubię rozbijać rdzeń na osobne projekty, aby kontrolować kierunek zależności. Więc zazwyczaj mam:

MyNamespace.SomethingWeb < - wiele UI
MyNamespace.ExtranetWeb < - wielokrotność UIs

MyNamespace.Application < - Evansa warstwy aplikacji z klas jak customerservice
MyNamespace.Domain

  • MyNamespace.Domain.Model < - podmioty
  • MyNamespace.Dom ain.Services < - usługi Doman
  • MyNamespace.Domain.Repositories

MyNamespace.Infrastructure < - realizacja repo itp

MyNamespace.Common < - Projekt, który wszystkie inne projekty mają Zależność do której ma rzeczy takie jak Logger, klasy Util, itp.

3

Chociaż jesteś również programistą .Net, Java implementation reference of the cargo app z DDD Eric Evans i Citerus to dobry zasób.

W kodzie docd można zobaczyć organizację DDD w ograniczonych kontekstach i zagregowanych w akcji, bezpośrednio w pakietach Java.

Dodatkowo, możesz rozważyć wydanie Billy'ego McCafferty: Sharp Architecture. Jest to implementacja ASP.Net MVC, NHibernate/Fluent NHibernate, która została stworzona z myślą o DDD.

Co prawda nadal trzeba będzie zastosować rozwiązanie folderu/przestrzeni nazw w celu podania kontekstów. Ale połącz podejście Evans z #Arch i powinieneś być na dobrej drodze.

Daj nam znać, z czym masz zamiar. Jestem na tej samej ścieżce, a nie daleko od ciebie!

Szczęśliwy kodowanie,

Kurt Johnson

+0

AKTUALIZACJA: Powinienem dodać rozwidlenie Sharp Architecture dla Who-Can-Help-Me (WCHM). Od września 2010 r. Opiekunowie WCHM zostali włączeni do zespołu współpracowników firmy Sharp. WCHM reorganizuje projekt Sharp Visual Studio do folderów Solution, które wyraźnie odwołują się do koncepcji DDD. Istnieją foldery dla domeny (Domain i domain-specific Infrastructure), prezentacji (widoki sieciowe i kontrolery sieciowe), framework (kod uważany za wielokrotnego użytku w różnych domenach i warstwę usług (Tasks). Oczekuje się, że przyszłe wersje Sharp Architecture będą odzwierciedlać to podejście . –

Powiązane problemy