2009-12-01 19 views
7

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

डीडीडी डिज़ाइन के संदर्भ में इसके बारे में जाने का सही तरीका क्या होगा? क्या मैं विशिष्ट विशिष्ट वर्गों को तैयार करूंगा, जैसे कि CompanySearchResult ऑब्जेक्ट जो केवल उन गुणों को उजागर करता है जिन्हें मैं प्रदर्शित करने में रूचि रखता हूं?

उत्तर

4

यह मेरे लिए एक उचित दृष्टिकोण की तरह लगता है।

बाद में

, ग्राहक आप की बात आती है, तो अपने SearchResult के लिए पूछ Company मॉडल के लिए कुछ असंबंधित प्रदर्शित करने के लिए - पास के आइसक्रीम की दुकानों की संख्या की तरह पागल कुछ आप की तुलना में अपने CompanySearchResult करने के लिए एक बहुत आसान समय इस जोड़कर होगा आपका डोमेन ऑब्जेक्ट

+0

मैं कुछ और अधिक "पागल" सोच रहा था जैसे खोज परिणाम को प्रदर्शन में केवल एक तत्व के रूप में। मैं एक ग्रिड और वर्तमान मौसम सारांश में डायरी अनुस्मारक की एक सूची भी चाहूंगा। क्या मैं विशेष रूप से उस फॉर्म या वेब पेज के लिए MyComplexFormViewModel क्लास में अपनी कंपनी सर्च रिसेट, वेदरसमरी और रिमाइंडरलिस्ट को एकत्र करूंगा? – Michael

+0

@ माइकल - उस परिदृश्य में मैं शायद एक कंटेनर व्यू बनाउंगा जिसमें कंपनीशर्च रिसेट, वेदरसमरी और रिमाइंडरलिस्ट – Kirschstein

+0

@ किर्स्चस्टीन - एक "कंटेनर व्यू" है जो मैंने MyComplexFormViewModel विचार के साथ प्रस्तावित किया है या उससे अलग है? – Michael

0

मैं इकाई विशेषताओं की एक समस्या का उपयोग करता हूं। उदाहरण के लिए:

// interface for "ID" attribute of Company entity 
public interface ICompany_ID { 
    Guid CompanyID{get;set;} 
} 
// interface for "Name" attribute of Company entity 
public interace ICompany_Name { 
    string Name{get;set;} 
} 
// interface for "Logo" attribute of Company entity 
public interface ICompany_Logo { 
    byte[] Logo{get;set;} 
} 

// interface for all attributes of Company entity 
public interface ICompany : ICompany_ID, ICompany_Name, ICompany_Logo { } 

// base class for classes based on Company entity 
public abstract class CompanyBase : ICompany_ID { 
    // implementation of ICompany_ID interface 
} 

// class for all attributes of Company entity 
public class Company : ICompany { 
    // implementation of ICompany interface (all attributes) 
} 

// class for Company name lookup 
public class CompanyNameLookup : CompanyBase, ICompany_Name { 
    // implementation of ICompany_Name interfade 
} 

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

अगला तरीका लुकअप कक्षाओं की गतिशील रचना है, लेकिन यह अधिक जटिल है। दूसरी तरफ, यह बहुत अधिक लचीला है।

संपादित करें: तब चयन उदाहरण के लिए हो सकता है:

var companies = (from c in db.Table<ICompany>() 
       order by c.Name 
       select new CompanyNameLookup { ID = c.ID, Name = c.Name } 
       ).ToList(); 

या danymicly बनाया प्रकार के लिए:

var companies = (from c in db.Table<ICompany>() 
       order by c.Name 
       select DynamicTypeFactory.New<ICompany_ID>(c.Id).And<ICompany_Name>(c.Name).Create() 
       ).ToList(); 

DynamicTypeFactory स्थिर विधि New और danymic के लिए धाराप्रवाह इंटरफेस के साथ वर्ग है रन-टाइम पर निर्माण कक्षाएं।

+3

आईएमएचओ, यह सिर्फ सादा गलत है। –

+0

@ फ़्रेडरिक: आपको क्यों लगता है? मैंने इस परिदृश्य को कई सफल व्यावसायिक परियोजनाओं में उपयोग किया और यह बहुत अच्छा काम करता है। – TcKs

+1

मैं फ्रेडरिक टीबी के साथ सहमत हूं, ऐसा लगता है कि यह थोड़ा लाभ के लिए अत्यधिक जटिल है। – Kirschstein

3

यह आमतौर पर "दृश्य मॉडल" या डेटा ट्रांसफर ऑब्जेक्ट के रूप में जाना जाता है। हो सकता है कि आप अपने डोमेन मॉडल द्वारा प्रकट किए गए पूरे डेटा पेड़ तक पहुंच न देख सकें। विशेष रूप से यदि आपके डोमेन मॉडल को उजागर करने का अर्थ है कि आपके दृश्य को आपके ऑब्जेक्ट ग्राफ़ में गहराई से डेटा को खींचने के लिए गहराई से खोदना होगा, तो मॉडल मॉडल मॉडल ऑब्जेक्ट्स के साथ काम करने को सरल बनाने के लिए एक बहुत अच्छा तरीका समझ सकता है। आपके मामले में, यदि आप मॉडल ऑब्जेक्ट से सीधे प्रत्यक्ष गुण खींच रहे हैं, तो यह समझ में आएगा कि क्या आप अपने शेष डोमेन मॉडल द्वारा आवश्यक अतिरिक्त डेटा को छिपाना चाहते हैं।

1

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

list.getCompany(1).getName()

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

+0

हम्म। ORMs। मेरे लिए अन्वेषण का एक और तरीका ... क्या आप एक अच्छा प्रारंभिक बिंदु सुझा सकते हैं? – Michael

+0

@ माइकल - स्टैक ओवरफ्लो पर .NET ORM से संबंधित कई प्रश्न हैं, बस कुछ ब्राउज़िंग करें। एनएचबेर्नेट आमतौर पर बड़ी परियोजनाओं के लिए सबसे अधिक अनुशंसा की जाती है, हालांकि इसमें एक सीधी सीखने की वक्र है (लेकिन बेहतर हो रही है)। छोटी परियोजनाओं के लिए और 'ग्राउंड रनिंग हिट' मामलों के प्रकार, शायद सबसनिक या लिंक्सटोस्क्ल यदि आपके पास पहले से ही डेटाबेस स्कीमा है। – Kirschstein

+1

मुझे नहीं लगता कि यह एक अच्छा दृष्टिकोण है। आपको दिमागी रूप से 'आलसी लोडिंग' का उपयोग नहीं करना चाहिए। आपको यह सोचने की ज़रूरत है कि आप इस तरह का गलत उपयोग करने के बजाय आलसी लोडिंग कहां और कब लागू करेंगे। अधिक जानकारी: http://davybrion.com/blog/2009/11/theres-lazy-loading-and-then-theres-lazy-coding/ मैं 'व्यू'/सर्च्रेल्ट क्लास पसंद करूंगा। एनएचबीनेटनेट जैसे ओआरएम का उपयोग करते समय भी, इसका उपयोग करना/समर्थन करना बहुत आसान है। आप बस अपने डोमेन मॉडल पर पूछ सकते हैं, और 'व्यू' ऑब्जेक्ट को वापस पाने के लिए प्रक्षेपण का उपयोग कर सकते हैं। –

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