2012-09-23 15 views
7

W aplikacjach następujących po DDD, nad którymi pracowałem, zwykle mamy warstwę usług zawierającą usługi + repozytoria + interfejsy dla repozytoriów i usług, wszystkie one żyją w tym samym zespole, podczas gdy domena model będzie żył w innym zestawie. Wydaje się, że wszystko, co nie pasuje do modelu domeny, jest zagracone w tym jednym wielkim projekcie.Repozytoria opakowań i ich interfejsy w DDD

W aplikacji zgodnej z zasadami i wzorcami DDD, w jaki sposób pakujesz repozytoria i implementowane interfejsy? Jakie są najlepsze praktyki w zakresie pakowania różnych logicznych części aplikacji DDD (lub ogólnie opakowania w tym przypadku)? Czy każda partycja logiczna musi znajdować się we własnym zespole? Czy to ma znaczenie?

Odpowiedz

5

Spojrzałbym na architekturę cebuli. Zasadniczo wszystkie modele domen i interfejsy dla usług domenowych są uważane za podstawowe. Warstwy zależą tylko od warstw nad nimi, które są bliżej rdzenia. Ich faktyczna realizacja jest obsługiwana przez infrastrukturę.

Zobacz tutaj http://jeffreypalermo.com/blog/the-onion-architecture-part-1/

Ostatecznie twoi interfejsy są co definiuje swoją aplikację. Logika tego, w jaki sposób jest realizowany, jest uzewnętrzniana. Tak więc oczekiwałbym, że będziesz mieć zestawy z Domeny Modelami i domenami, front end (np. MVC itp.), A następnie zespół infrastruktury, który implementuje rzeczy takie jak NHibernate do dostarczania danych itp.

Możesz zobaczyć różne próbki, które implementują architektura w różnych częściach połączonego artykułu. Najprostszym z nich jest tutaj https://bitbucket.org/jeffreypalermo/onion-architecture/get/1df2608bc383.zip

Można zobaczyć na pytania związane z tym tutaj https://stackoverflow.com/questions/tagged/onion-architecture

Główną zaletą jest to, że w dużej mierze dotyczy infrastrukturalne, które będą najczęściej zmieniają. Nowe technologie warstwy danych, nowe pliki do przechowywania plików itp. Również twoja domena podstawowa powinna być względnie stabilna, ponieważ nie implementuje niczego, tylko definiuje przez kontrakt (interfejsy), czego potrzebuje. Przedstawiając problemy związane z implementacją w jednym miejscu, minimalizujesz ilość zmian, które będą wymagane w poszczególnych złożeniach.

+0

Świetne odniesienie do architektury cebuli, której w ogóle nie znałem. dzięki. – kabaros

0

Wskazówki dotyczące projektowania warstw można znaleźć w dokumencie DDD book. Już w zasadzie otrzymał:

  • Domain
  • Infrastruktura
  • Zastosowanie
  • UI

Usługi są w 3 rodzajach: obsługa aplikacji warstwa, warstwa Infrastruktura i usług serwisowych warstwa Domain, w zależności na temat tego, co robi usługa. Jeśli chodzi o repozytoria, ich umowy (interfejsy) często znajdują się w domenie, a ich konkretne wdrożenia znajdują się w warstwie infrastruktury.

Co do złożeń, zaleciłbym co najmniej jedną warstwę. Zespoły i biblioteki DLL są związane z możliwością ponownego użycia, rozdzielaniem problemów i oddzieleniem - czy będę w stanie wybrać dll i upuścić go, aby ponownie użyć go w innej aplikacji? Czy będę w stanie to zrobić bez przeciągania szeregu niepowiązanych funkcji, które spowodują niepotrzebną złożoność tej innej aplikacji? Czy będę w stanie łatwo zamieniać moją bibliotekę dll na inną, zmieniając tylko jedną linię kodu w moim module wtrysku zależności? i tak dalej.