6

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

क्या कोई कारण है कि यह एक बुरा अभ्यास क्यों है? क्या यह अन्य पैटर्न तोड़ता है?

उत्तर

4

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

अगर मुझे इसे अलग करना पड़ा तो मैं इसे उदा। एक पैकेज (जावा के मामले में) कम से कम डोमेन मॉडल का एक ही स्तर और इसे हमेशा इसके साथ भेजता है उदा।

upper 
    --> domain 
    --> domain_factory 
+0

ऐसा लगता है कि अधिकांश लोग डोमेन मॉडल में होने के साथ सहमत हैं। तो फिर आप डोमेन परत में अपने कारखानों की मौजूदगी कहां से अनुशंसा करते हैं? एक अलग असेंबली, फ़ोल्डर, नामस्थान? – retslig

4

स्मृति से, एरिक इवांस की पुस्तक में ऐसे उदाहरण हैं जहां ऑब्जेक्ट कारखानों डोमेन परत का बहुत अधिक हिस्सा हैं।

मेरे लिए, यह आपके कारखानों का पता लगाने के लिए सही समझ में आता है।

7

डीडीडी में एक कारखाना factory pattern का एक उदाहरण है और इस तरह इसका उपयोग किया जाना चाहिए जहां यह सबसे अधिक समझ में आता है। विचार करने का एक अन्य सिद्धांत information expert पैटर्न है जो अनिवार्य रूप से कहता है कि व्यवहार को जानकारी के सबसे नज़दीकी वर्गों को असाइन किया जाना चाहिए। इसलिए, यदि आपके पास कुछ डोमेन विशिष्ट नियम और तर्क हैं जिन्हें आप लागू करना चाहते हैं, तो कारखाने को डोमेन परत में रखें - आखिरकार, कारखाना डोमेन ऑब्जेक्ट बनाता है। ध्यान दें कि आपके पास अन्य परतों में अन्य प्रकार की फैक्ट्रियां हो सकती हैं।

0

यदि बिल्डर्स/कारखानों में केवल डोमेन कक्षाओं और प्राइमेटिव पर निर्भरता है, तो उन्हें डोमेन परत में रखें, अन्यथा उन्हें डोमेन परत के बाहर रखें।

0

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

आप डोमेन परत में कारखानों रखने, वे आप जब आप पैरामीटर के रूप में जटिल प्रकार (सी # कोड उदाहरण) की जरूरत है मदद नहीं करेगा:

Application Layer: 

//this Factory resides in the Domain Layer and cannot reference anything else outside it 
Person person = PersonAggregateFactory.CreateDeepAndLargeAggregate(
      string name, string code, string streetName,... 
      and lots of other parameters...); 

//these ones reside in Application Layer, thus can be much more simple and readable: 
Person person = PersonAggregateFactory.CreateDeepAndLargeAggregate(CreatePersonCommand); 
Person person = PersonAggregateFactory.CreateDeepAndLargeAggregate(PersonDTO); 



Domain Layer: 

public class Person : Entity<Person> 
{ 
    public Address Address {get;private set;} 
    public Account Account {get;private set;} 
    public Contact Contact {get;private set;} 
    public string Name {get;private set;} 

    public Person(string name, Address address,Account account, Contact contact) 
    { 
     //some validations & assigning values... 
     this.Address = address; 
     //and so on... 

    } 

} 

public class Address:Entity<Address>{ 
    public string Code {get;private set;} 
    public string StreetName {get;private set;} 
    public int Number {get;private set;} 
    public string Complement {get;private set;} 
    public Address(string code, string streetName, int number, string complement?) 
    { 
     //some validations & assigning values... 
     code = code; 
    } 

} 

public class Account:Entity<Account>{ 
    public int Number {get;private set;} 

    public Account(int number) 
    { 
     //some validations & assigning values... 
     this.Number = number; 
    } 

} 

//yout get the idea: 
//public class Contact... 

इसके अलावा, वहाँ के अंदर कारखानों रखने पर कोई दायित्व नहीं है (Domain Driven Design Quickly से) डोमेन परत:

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

जैसा कि मैं स्मृति में लगातार वस्तुओं को लोड करने के लिए कारखानों का उपयोग नहीं करता, उन्हें एप्लिकेशन की तुलना में अन्य परतों से पहुंच योग्य नहीं होना चाहिए। यहां इसका कारण (Domain Driven Design Quickly से) है:

एक और अवलोकन कारखानों खरोंच से नई वस्तुओं भी बनाना होगा, या वे जिन वस्तुओं पर पहले से ही अस्तित्व में पुनर्गठित करने के लिए आवश्यक हैं, लेकिन शायद किया गया है एक डेटाबेस से कायम है। डेटाबेस में अपने आराम स्थान से इकाइयों को वापस लाने में डेटाबेस को से एक पूरी तरह से अलग प्रक्रिया शामिल है जिसमें एक नया बनाया गया है। एक स्पष्ट अंतर यह है कि नया ऑब्जेक्ट को नई पहचान की आवश्यकता नहीं है। ऑब्जेक्ट में पहले से ही एक है। इनवेरिएंट के उल्लंघन का अलग-अलग व्यवहार किया जाता है। जब एक नया ऑब्जेक्ट स्क्रैच से बनाया गया है, तो अपवादों का उल्लंघन किसी भी अपवाद में समाप्त होता है। हम डेटाबेस से पुनर्निर्मित वस्तुओं के साथ ऐसा नहीं कर सकते हैं। वस्तुओं को किसी भी तरह से मरम्मत की आवश्यकता है, इसलिए वे कार्यात्मक हो सकते हैं, अन्यथा डेटा हानि होती है।