13

मॉडल एक परत है और इसमें सभी डोमेन व्यवसाय तर्क शामिल हैं। डोमेन संचालित डिजाइन व्यापार तर्क में
जैसे विभिन्न बिल्डिंग ब्लॉक में विभाजित किया जा सकता है।एमवीसी फ्रेमवर्क में डीडीडी लागू करें - एमवीसी में PHP

डोमेन संचालित डिजाइन डोमेन मॉडल में है।

एक डोमेन मॉडल अवशोषण की एक प्रणाली है जो चयनित ज्ञान, प्रभाव या गतिविधि (एक डोमेन) के क्षेत्र के पहलुओं का वर्णन करता है। मॉडल तो आमतौर पर DDD.in MVC चौखटे में डोमेन मॉडल पर एक बेहतर ध्यान केंद्रित किया है कि डोमेन

डेवलपर डोमेन प्रेरित डिजाइन, या Doctrine2 या हाइबरनेट, उपयोग कर रहा है पढ़ा है से संबंधित समस्याओं को हल करने के लिए इस्तेमाल किया जा सकता है मॉडल परत DDD.it में डोमेन मॉडल के साथ ओवरलैप का मतलब है हम MVC चौखटे में मॉडल फ़ोल्डर में डोमेन मॉडल को लागू कर सकते

इस तरह के एक कार्यान्वयन below.shows दिखाया गया है कि कैसे मॉडल फ़ोल्डर संरचना

Model(this can model or domain) 
    | 
    |----Entities 
    | |---BlogPost.php 
    | |---Comment.php 
    | |---User.php 
    | 
    |----Repositories 
    | |---BlogPostRepository.php 
    | |---CommentRepository.php 
    | |---UserRepository.php 
    | 
    |----Services 
    | |---UserService.php 
    | 
    |----factories 
    | |---userfactory.php 
    | 
    |----dataMappers 
    | |---userDataMapper.php // this inherit from Eloquent model 
    | 
    |----ValueObject 

है

  • मैं जानना चाहता हूँ मेरी पहली धारणा है (MVC चौखटे में मॉडल फ़ोल्डर में डोमेन मॉडल लागू कर सकते हैं) सही है?
  • यह सही डिजाइन है कि सभी DDD में बिल्डिंग ब्लॉक मॉडल फ़ोल्डर में लागू (जैसा कि ऊपर में दिखाया गया है) जैसे संस्थाओं, सेवाओं है, खजाने
  • या किसी अन्य सुझाव है कि आप इस के बारे में है कार्यान्वयन।
  • अगर यह गलत है ऐसी इकाइयों, सेवाओं, MVC चौखटे
+0

"क्या यह सही डिजाइन है कि डीडीडी में सभी बिल्डिंग ब्लॉक मॉडल फ़ोल्डर (जैसे ऊपर दिखाए गए अनुसार) में लागू होते हैं जैसे संस्थाएं, सेवाएं, भंडार" - यह आपके ऊपर है कि आप कोड बेस को कैसे बनाते हैं। मेरे लिए यह प्रति बाध्य संदर्भ (जैसे ब्लॉग, उपयोगकर्ता) निर्देशिका में और इस निर्देशिका के भीतर ठोस वर्ग (उपयोगकर्ता, उपयोगकर्ता रिपोजिटरी, ...) के भीतर एक निर्देशिका रखने के लिए और अधिक समझदारी होगी। यह स्वाद का विषय है, लेकिन मैं सुविधा द्वारा पैकेज पसंद करता हूं और परत से नहीं .. –

+0

एमवीसी यूआई आर्किटेक्चर का अधिक है। यह डीडीडी में अच्छी तरह से फिट नहीं है। –

+0

डीडीडी और एमवीसी की तुलना न करें क्योंकि यह आपके फ़ोल्डर संरचनाओं को व्यवस्थित करने के तरीके के बारे में नहीं है। डीडीडी लगभग आपके तरीके को डिजाइन करने का तरीका है। डीडीडी में विभिन्न सामरिक और सामरिक पैटर्न शामिल हैं। एमवीसी सिर्फ एक सामरिक पैटर्न –

उत्तर

6
MVC में

मॉडल एक परत है और यह सब शामिल है में खजाने के रूप में DDD के निर्माण ब्लॉक को लागू करने का सही तरीका है क्या डोमेन व्यवसाय तर्क।

मुझे संदेह है कि एमवीसी पैटर्न स्वयं डोमेन के बारे में कुछ खास घोषित करता है। यह गुणों के बैग के रूप में मॉडल संचालित करता है और यह परवाह नहीं करता कि यह कैसे बनाया गया था और यह इसके आविष्कारों की रक्षा कैसे करता है।

उसी समय Onion architecture बताता है कि डोमेन सेवा से बाहर डोमेन को अलग करना महत्वपूर्ण है (जो एमवीसी फ्रेमवर्क है)। तो मैं डोमेन परत जो संस्थाओं, मूल्य वस्तुओं, डोमेन घटनाओं और समुच्चय एक अलग मॉड्यूल या एक शीर्ष स्तर फ़ोल्डर में शामिल रखना चाहते। MVC सामान से अलग डोमेन रखने के लिए

enter image description here

एक और कारण यह है कि यह है, क्योंकि प्रत्येक संदर्भ का अपना मॉड्यूल/फ़ोल्डर की जरूरत है आप आसान कई bounded contexts प्रबंधन की अनुमति देगा।

मैं आपको this ASP MVC project संरचना की जांच करने के लिए तैयार करता हूं। यह प्रसिद्ध डीडीडी विशेषज्ञ द्वारा डिजाइन किया गया था। डोमेन के अलावा, कृपया देखें कि एमवीसी भाग कैसे व्यवस्थित किया जाता है। यह feature slice दृष्टिकोण का शोषण करता है जो इन दिनों अधिक से अधिक लोकप्रिय हो रहा है और मुझे यह बेहद उपयोगी लगता है।

4

हालांकि मैं डीडीडी की दुनिया में काफी नया हूं, धीरे-धीरे एक आवेदन माइग्रेट करने की प्रक्रिया में मैं एक और डीडीडी उन्मुख संरचना पर काम कर रहा था, मैंने निर्देशिका संरचना के सवाल का भी सामना किया। एक साथ जानकारी मैं जो पूरी तरह से वैचारिक मैं निम्नलिखित सरल निर्देशिका संरचना के साथ आया नहीं था खोजने के लिए सक्षम था, (जो एक CRUD उन्मुख Laravel आवेदन के भीतर मौजूद है) Piecing, कि मुझे काफी अच्छी तरह से सेवा की है:

app/ 
    ProjectName/ 
     Core/ 
      Application/ 
      Domain/ 
      Infrastructure/ 
     User/ 
      Application/ 
       Services/ 
        CreateUserService.php 
        FindUserService.php 
        UpdateUserService.php 
      Domain/ 
       Role.php 
       RoleDAO.php 
       User.php 
       UserDAO.php 
       UserNotCreated.php 
       UserNotFound.php 
       UserNotUpdated.php 
       UserWasCreated.php 
       UserWasUpdated.php 
      Infrastructure/ 
       EloquentRoleDAO.php 
       EloquentUserDAO.php 

आपकी विशिष्ट चिंताओं को संबोधित करते हुए, भंडार इंटरफेस और इकाइयों को एप्लिकेशन के प्रत्येक अलग-अलग घटक (उदाहरण के लिए - उपयोगकर्ता) के नीचे डोमेन फ़ोल्डरों के भीतर रखा गया था। इसके अतिरिक्त, यह वह जगह है जहां मैंने किसी भी डोमेन घटनाओं और अपवादों को रखा था। रिपोजिटरी कार्यान्वयन प्रत्येक इंफ्रास्ट्रक्चर फ़ोल्डर के तहत रखा गया था। एप्लिकेशन सेवाओं के तहत एक सेवा निर्देशिका के भीतर आवेदन सेवाएं रखी जाती हैं।

अपने स्वयं के आवेदन की संकर प्रकृति को छोड़कर (मैं ओआरएम-रिलायंट डीएओ/एंटिटीज, लेनदेन स्क्रिप्ट्स का उपयोग कर रहा हूं, और कुछ भिन्नताओं का नाम देने के लिए वैल्यू ऑब्जेक्ट्स से परहेज कर रहा हूं), यह अभी भी किसी न किसी विचार के रूप में काम करने में मदद कर सकता है एक एमवीसी ऐप के भीतर एक संभावित डीडीडी निर्देशिका संरचना।

0

मैं एमवीसी में मॉडल को व्यूमोडल्स और कमांड का संयोजन मानता हूं। आने वाले अनुरोधों को उन आदेशों के लिए मैप किया जाता है जो "लिखने" परत पर प्रेषित होते हैं जो उचित योग को पुनर्प्राप्त करता है और उस पर उचित विधि को कॉल करता है, फिर लेनदेन करता है।

व्यूमोडेल उपयोगकर्ता इंटरफ़ेस के लिए प्रेजेंटेशन-तैयार प्रारूप में डेटा ले जाने के लिए पूरी तरह मौजूद हैं। आपके पास एक बहुत ही सरल "पढ़ा" परत हो सकती है जो डेटाबेस दृश्यों या तालिकाओं से पूछताछ करता है और परिणाम क्लाइंट को देता है। यह आपको एक डोमेन मॉडल प्राप्त करने की अनुमति देगा जो गेटर्स और सेटर्स के माध्यम से अपने सभी राज्यों का खुलासा नहीं करता है।

+0

है जो मैं आपके डोमेन मॉडल को आपके आवेदन से अलग करने के बारे में कहना चाहता हूं। आदर्श रूप में, डोमेन मॉडल एक अलग पैकेज में होगा ताकि इसे कई अनुप्रयोगों द्वारा साझा और उपयोग किया जा सके। – pnschofield

0

मैं @ झहरो के सुझाव से सहमत हूं।

अच्छा संरचना नीचे की तरह है:

  • देखें (शामिल केवल देखने टहनी, एचटीएमएल और संपत्ति की तरह भाग)
  • कोर (नियंत्रक, फार्म, श्रोताओं, सहायकों)
  • BusinessLogic (सेवाओं को शामिल करें)
  • इकाई (इकाई, आदेश, सत्यापनकर्ता) केवल

1) देखें हिस्सा पहुँच CoreBundle और behavio परिवर्तन नहीं करता है डेटाबेस का यूआर

2) कोर हिस्सा पहुँच BuisnessLogic और इकाई

3) BuisnessLogic हिस्सा पहुँच केवल इकाई

4) इकाई हिस्सा केवल डेटाबेस का उपयोग।

0

आपकी पहली धारणा सही नहीं है, एमवीसी वास्तव में डीडीडी के साथ फिट नहीं है, सीक्यूआरएस पैटर्न का उपयोग करने के लिए एक बेहतर तरीका होगा।

आपकी दूसरी धारणा भी सही नहीं है इमारतों ब्लॉक सभी डोमेन मॉडल फ़ोल्डर में नहीं हैं, वास्तव में, यहां अपनी परियोजना के लिए एक अच्छा संरचना है,:,

ProjectName/ 
    Application/ 
     Blog/ 
      Command/ 
       CommentToBlogPostCommand.php 
       ChangeCommentContent.php 
       DescribeBlogPostCommand.php 
       NewBlogPostCommand.php 
       ... 
      Data/ 
       BlogPostData.php 
       BlogPostCommentsData.php (POPO containing BlogPost infos and the comments array) 
       CommentData.php (Single comment infos) 
      BlogPostApplicationService.php 
      BlogPostQueryService.php 
      CommentApplicationService.php 
      CommentQueryService.php 
     Identity/ 
      Command/ 
       AuthenticateUserCommand.php 
       ChangeEmailAddressCommand.php 
       ChangeUserPasswordCommand.php 
       ChangeUserPersonalNameCommand.php 
       DefineUserEnablementCommand.php 
       RegisterUserCommand.php 

      UserApplicationService.php (this defines the actions that can be done by your application related to user domain, injected in presentation layer responding to user events) 
      UserQueryService.php (this will usually be injected in your presentation layer) 
    Domain/ 
     Model/ 
      Blog/ 
       BlogPost.php 
       BlogPostClosed.php (this could be a list of possible events) 
       BlogPostDescriptionChanged.php 
       BlogPostModeratorChanged.php 
       BlogPostReopened.php 
       BlogPostStarted.php 
       BlogPostRepository.php (interface) 
       Comment.php (this is an Entity, or Aggregate Root) 
       CommentContentAltered.php (this could be an event) 
       CommentAuthor.php (this could be a ValueObject, containing the username) 
       CommentRepository.php (interface) 
       CommentedToBlogPost.php (this could be another event when adding a comment to a blogpost) 
       ... 
      Identity/ 
       ContactInformation.php (VO or Person) 
       Enablement.php (VO of User) 
       EmailAddress.php (VO of ContactInformation) 
       FullName.php (VO or Person) 
       Person.php (ValueObject of User) 
       User.php (constructor visibility might be package-protected) 
       UserFactory.php 
       UserRepository.php (this is an interface) 
       UserService.php (this is a domain service) 
    Infrastructure/ 
     Persistence/ 
      LavarelBlogPostRepository.php (this implements BlogPostRepository) 
      LavarelCommentRepository.php (this implements CommentRepository) 
      LavarelUserRepository.php (this implements UserRepository) 
    Interfaces/ 
     ... 

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

टिप्पणी नोट करें लेखक वर्ग एक मूल्य वस्तु हो सकती है, जिसमें डेटाबेस की उपयोगकर्ता आईडी नहीं है बल्कि एक अद्वितीय उपयोगकर्ता नाम है। चूंकि उपयोगकर्ता समग्र रूट किसी अन्य पैकेज से है: जो एक डोमेन PointOfView से समझ में आता है। हम इसे एक पहचान (या उपयोगकर्ता नाम) कह सकते हैं। यह आदर्श रूप से उपयोगकर्ता तालिका के एक अद्वितीय कॉलम पर मैप किया जाएगा, लेकिन टिप्पणी तालिका का अनुक्रमित मूल्य होगा।

एक और विकल्प ब्लॉग पैकेज में उपयोगकर्ता को उसी अवधारणा के हिस्से के रूप में उपयोग करना होगा जो एक ब्लॉग है लेकिन डीडीडी इस दृष्टिकोण की अनुशंसा नहीं करता है। असल में यह आपको एक अलग बाध्य संदर्भ में पहचान और पहुंच डालने की सिफारिश करेगा, लेकिन मुझे लगता है कि आप जिस आवेदन को लिख रहे हैं उसके संदर्भ में उपयोगकर्ता को मैपिंग लिखना एक टिप्पणी के हिस्से के रूप में ठीक हो सकता है।

आधारभूत संरचना परत में, आप अपने दृढ़ता प्रदाता को परिभाषित करते हैं, इस तरह, जिस दिन आप सिद्धांत पर स्विच करना चाहते हैं, केवल इस पैकेज में कार्यान्वयन को बदलना चाहिए।

एप्लिकेशन परत सुरक्षा, अवधि लेनदेन संबंधी संदर्भ, और उच्च स्तरीय घटनाओं को लॉग करने के लिए ज़िम्मेदार है।

यदि आपको कुछ स्पष्टीकरण की आवश्यकता है तो मैं आपको कक्षाओं के शिष्टाचार के बारे में अधिक जानकारी प्रदान कर सकता हूं। इसके अलावा इस पराक्रम की आवश्यकता है कुछ बुनियादी ढांचे या एक समर्थन ढांचे यह काम कर रहा करने के लिए, मैं सोच रहा हूँ:, entitites में

  • घटना डिस्पैचर उपलब्ध
  • घटना बस किसी तरह का

    • निर्भरता इंजेक्शन, यदि आप की योजना इन घटनाओं का उपभोग करने के लिए।
  • संबंधित मुद्दे