2009-02-09 7 views
25

मैंने डीडीडी के बारे में सीखना शुरू कर दिया है और जानना चाहता हूं कि दूसरों ने अपनी परियोजनाओं का आयोजन कैसे किया है।एक डोमेन संचालित डिजाइन परियोजना को व्यवस्थित करने के लिए कैसे?

मैं अपने AggregateRoots के मुताबिक व्यवस्थित करके बंद शुरू कर दिया है: - उत्पाद
-

MyApp.Domain (नाम स्थान डोमेन मॉडल के लिए)

MyApp.Domain.Product
IProductService
- IProductRepository
- आदि

MyApp.Domain.Comment
- टिप्पणी
- ICommentService
- ICommentRepository
- आदि

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository: IProductRepository
- आदि

जिस समस्या को मैंने इसमें शामिल किया है वह यह है कि मुझे अपने डोमेन उत्पाद को MyApp.Domain.Product.Product या Product.Product के रूप में संदर्भित करना होगा। मुझे उत्पाद के लिए अपने लिनक डेटा मॉडल के साथ भी एक संघर्ष मिलता है .... मुझे MyApp.Domain.Product.Product और MyApp.Respoitories.Product जैसे दो के बीच विचलित करने के लिए कोड की बदसूरत रेखाओं का उपयोग करना होगा।

मैं वास्तव में देखने के लिए कैसे दूसरों DDD के लिए उनके समाधान का आयोजन किया दिलचस्पी है ...

मैं अपने आईडीई के रूप में दृश्य स्टूडियो का उपयोग कर रहा हूँ।

बहुत बहुत धन्यवाद।

उत्तर

19

मैं चीजों को बहुत ही सरल रखने की कोशिश जब भी मैं, तो आम तौर पर कुछ इस तरह मेरे लिए काम करता कर सकते हैं:

Myapp.Domain - सभी डोमेन विशिष्ट वर्गों इस नाम स्थान

Myapp.Data का हिस्सा - पतली परत है कि डोमेन से डेटाबेस को सारणीबद्ध करता है।

Myapp.Application - सभी "समर्थन कोड", प्रवेश, साझा उपयोगिता कोड, सेवा उपभोक्ताओं आदि

Myapp.Web - वेब UI

तो कक्षाएं उदाहरण के लिए होगा:

  • Myapp.Domain.Sales.Order
  • Myapp.Domain.Sales.Customer
  • Myapp.Domain.Pricelist
  • Myapp.Data.OrderManager
  • Myapp.Data.CustomerManager
  • Myapp.Aplication।Utils
  • Myapp.Application.CacheTools

आदि

विचार मेरे मन में रखने के लिए के रूप में मैं साथ जाने की कोशिश है कि "डोमेन" नाम स्थान क्या आवेदन की वास्तविक तर्क कब्जा है। तो क्या है "आप" डोमेन विशेषज्ञों "(दोस्तों जो आवेदन का उपयोग करेंगे) के बारे में बात कर सकते हैं। यदि मैं किसी चीज के कारण कुछ कोडिंग कर रहा हूं, तो यह डोमेन नेमस्पेस में होना चाहिए, और जब भी मैं कुछ ऐसा कोड करता हूं जिसे उन्होंने उल्लेख नहीं किया है (जैसे लॉगिंग, त्रुटियों का पता लगाने आदि) यह डोमेन नेमस्पेस में नहीं होना चाहिए।

इस वजह से मैं भी जटिल वस्तु पदानुक्रम बनाने के बारे में सावधान हूं। आदर्श रूप से डोमेन मॉडल की कुछ सरल सरलीकृत ड्राइंग को गैर-कोडर द्वारा आसानी से समझने योग्य होना चाहिए।

इस अंत तक मैं सामान्य रूप से पैटर्न के बारे में सोचकर शुरू नहीं करता हूं। मैं केवल मानक ऑब्जेक्ट उन्मुख डिज़ाइन दिशानिर्देशों के बाद, डोमेन को जितना सरल हो सकता हूं, उतना सरल मॉडल बनाने का प्रयास करता हूं। एक वस्तु होने की क्या ज़रूरत है? वे कैसे संबंधित हैं?

मेरे मन में DDD जटिल सॉफ्टवेयर से निपटने के बारे में है, लेकिन अपने सॉफ्टवेयर बहुत आप के साथ शुरू करने के लिए आसानी से एक स्थिति में जा सकते हैं, जहां काम करने के DDD तरह से जटिलता ला देता है के बजाय उसे निकाल देता जटिल ही नहीं है अगर।

एक बार जब आप जान सकते हैं कि कुछ चीजें आयोजित किया जाना चाहिए शुरू कर देंगे, और फिर आप जो पैटर्न का उपयोग करने के, जो कक्षाओं समुच्चय आदि

मेरे उदाहरण में कर रहे हैं पता चल जाएगा अपने मॉडल में जटिलता का एक निश्चित स्तर है , Myapp.Domain.Sales.Order इस अर्थ में एक समग्र रूट होगा कि जब इसे इंस्टॉल किया जाता है तो इसमें अन्य ऑब्जेक्ट्स, जैसे कि ग्राहक ऑब्जेक्ट और ऑर्डर लाइनों का संग्रह होता है, और आप केवल उस विशेष ऑर्डर लाइनों तक पहुंच सकते हैं ऑर्डर ऑब्जेक्ट के माध्यम से ऑर्डर करें।

हालांकि, चीजों को सरल रखने के लिए, मेरे पास "मास्टर" ऑब्जेक्ट नहीं होगा जिसमें केवल बाकी सब कुछ शामिल है और इसका कोई अन्य उद्देश्य नहीं है, इसलिए ऑर्डर क्लास में मूल्यों और गुण होंगे जो एप्लिकेशन में उपयोगी हैं।

Myapp.Domain.Sales.Order.TotalCost

Myapp.Domain.Sales.Order.OrderDate

Myapp.Domain.Sales.Order.Customer:

तो मैं जैसी चीजों के संदर्भ लेंगे .PreferredInvoiceMethod

Myapp.Domain.Sales.Order.Customer.Address.Zip

आदि

+0

बनाता है भावना ... आदेश और ग्राहक आप AggRoots सही कर रहे हैं? तो जब आप अपने ऑर्डर ऑब्जेक्ट को संदर्भित करते हैं तो आपको इसे करना होगा: Myapp.Domain.Sales.Order.Order ?? –

+0

हां और नहीं - मैंने अपना उदाहरण थोड़ा बढ़ाया, क्योंकि टिप्पणी अनुभाग थोड़ा छोटा है। – Console

+0

'डेटा' नामस्थान में प्रबंधक 'वर्ग मुझे एनीमिक मॉडल –

0

आपके डोमेन में शायद नाम है, इसलिए आपको इस नाम को नामस्थान के रूप में उपयोग करना चाहिए।

मैं आमतौर पर एक namespace डोमेन नेमस्पेस के अंतर्गत हठ कहा जाता है में डाल भंडार कार्यान्वयन और डेटा का उपयोग विवरण।

एप्लिकेशन नाम का नाम नामस्थान के रूप में उपयोग करता है।

5

मैं, आवेदन की जड़ नाम स्थान में डोमेन का अपना एक विधानसभा में की तरह:

Acme.Core.dll [जड़ नाम स्थान: Acme]

यह बड़े करीने से तथ्य यह है कि डोमेन सब के दायरे में है का प्रतिनिधित्व करता है आवेदन के अन्य भाग। (अधिक के लिए, जेफरी पालेर्मो द्वारा The Onion Architecture देखें)।

अगला, मेरे पास डेटा असेंबली है (आमतौर पर NHibernate के साथ) जो डोमेन ऑब्जेक्ट्स को डेटाबेस में मैप करती है। इस परत को लागू करता है भंडार और सेवा इंटरफेस:

Acme.Data.dll [जड़ नाम स्थान: Acme.Data]:

Acme.Presentation.dll [जड़ नाम स्थान

फिर, मैं एक प्रस्तुति विधानसभा मेरी यूआई पैटर्न के- पसंद के तत्व घोषित करता है : Acme.Presentation]

अंत में, यूआई प्रोजेक्ट (यहां एक वेब ऐप मानते हुए) है। यह वह जगह है जहां पूर्ववर्ती परतों में तत्वों की संरचना होती है:

Acme.Web [जड़ नाम स्थान: Acme.Web]

0

मैं बाहर codecampserver जाँच होगी सेटअप के बाद से वहाँ काफी आम है।

उनके पास एक मूल परियोजना है जिसमें वे एप्लिकेशन और डोमेन परत दोनों शामिल हैं। अर्थात। प्याज के अंदर (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/)।

मैं वास्तव में निर्भरता की दिशा को नियंत्रित करने के लिए अलग-अलग परियोजनाओं में कोर को तोड़ना पसंद करता हूं। तो आम तौर पर मेरे पास है:

MyNamespace.SomethingWeb < - कई UI के
MyNamespace.ExtranetWeb < - कई UI के

MyNamespace.Application < - इवांस के आवेदन वर्गों के साथ customerservice
MyNamespace.Domain की तरह परत

  • MyNamespace.Domain.Model < - संस्थाओं
  • MyNamespace.Dom ain.Services < - doman सेवाओं
  • MyNamespace.Domain.Repositories

MyNamespace.Infrastructure < - रेपो कार्यान्वयन आदि

MyNamespace.Common < - जो अन्य सभी परियोजनाओं एक है एक परियोजना जो करने के लिए निर्भरता एक लॉगर, util कक्षाएं, आदि

3

यद्यपि आप भी एक नेट डेवलपर हैं, तो Java implementation reference of the cargo app DDD से एरिक इवांस और Citerus द्वारा एक अच्छा स्रोत है जैसी चीजों है।

डॉक कोड में, आप डीडीडी-संगठन को बाध्य संदर्भों में और एग्रीगेट्स को कार्रवाई में, सीधे जावा पैकेज में देख सकते हैं।

इसके अतिरिक्त, आप बिली मैककैफ़र्टी के Sharp Architecture पर विचार कर सकते हैं। यह एक एएसपी.NET एमवीसी, एनएचबेर्नेट/फ्लुएंट एनएचबेर्नेट कार्यान्वयन है जो डीडीडी के साथ दिमाग में बनाया गया है।

मान्य है, आपको अभी भी संदर्भ प्रदान करने के लिए फ़ोल्डर/नामस्थान समाधान लागू करने की आवश्यकता होगी। लेकिन, युवरास # आर्च के साथ दृष्टिकोण जोड़े और आपको अपने रास्ते पर अच्छा होना चाहिए।

हमें बताएं कि आप किसके साथ जा रहे हैं। मैं भी उसी रास्ते पर हूं, और आपसे दूर नहीं!

मुबारक कोडिंग,

कर्ट जॉनसन

+0

अद्यतन की चीज़ बनाते हैं अद्यतन: मुझे यह जोड़ना चाहिए कि तीव्र वास्तुकला का कौन-कर-सहायता-मी (डब्ल्यूसीएचएम) कांटा। सितंबर 2010 तक, डब्लूसीएचएम रखरखाव को शार्प के लिए योगदानकर्ता टीम में शामिल किया गया है। डब्ल्यूसीएचएम तीव्र दृश्य स्टूडियो प्रोजेक्ट को सॉल्यूशन फ़ोल्डर्स में पुनर्गठित करता है जो स्पष्ट रूप से डीडीडी अवधारणाओं को संदर्भित करता है। डोमेन (डोमेन और डोमेन-विशिष्ट इंफ्रास्ट्रक्चर), प्रस्तुति (वेब ​​दृश्य और वेब नियंत्रक), ढांचे (डोमेन पर पुन: प्रयोज्य माना जाता है, और एक सेवा परत (कार्य) के लिए फ़ोल्डर्स हैं। तीव्र वास्तुकला के भविष्य के संस्करणों से इस दृष्टिकोण को प्रतिबिंबित करने की उम्मीद है । –

संबंधित मुद्दे