मैं एप्लिकेशन लेयर में कारखानों को प्राथमिकता देता हूं।
आप डोमेन परत में कारखानों रखने, वे आप जब आप पैरामीटर के रूप में जटिल प्रकार (सी # कोड उदाहरण) की जरूरत है मदद नहीं करेगा:
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 से) है:
एक और अवलोकन कारखानों खरोंच से नई वस्तुओं भी बनाना होगा, या वे जिन वस्तुओं पर पहले से ही अस्तित्व में पुनर्गठित करने के लिए आवश्यक हैं, लेकिन शायद किया गया है एक डेटाबेस से कायम है। डेटाबेस में अपने आराम स्थान से इकाइयों को वापस लाने में डेटाबेस को से एक पूरी तरह से अलग प्रक्रिया शामिल है जिसमें एक नया बनाया गया है। एक स्पष्ट अंतर यह है कि नया ऑब्जेक्ट को नई पहचान की आवश्यकता नहीं है। ऑब्जेक्ट में पहले से ही एक है। इनवेरिएंट के उल्लंघन का अलग-अलग व्यवहार किया जाता है। जब एक नया ऑब्जेक्ट स्क्रैच से बनाया गया है, तो अपवादों का उल्लंघन किसी भी अपवाद में समाप्त होता है। हम डेटाबेस से पुनर्निर्मित वस्तुओं के साथ ऐसा नहीं कर सकते हैं। वस्तुओं को किसी भी तरह से मरम्मत की आवश्यकता है, इसलिए वे कार्यात्मक हो सकते हैं, अन्यथा डेटा हानि होती है।
ऐसा लगता है कि अधिकांश लोग डोमेन मॉडल में होने के साथ सहमत हैं। तो फिर आप डोमेन परत में अपने कारखानों की मौजूदगी कहां से अनुशंसा करते हैं? एक अलग असेंबली, फ़ोल्डर, नामस्थान? – retslig