2012-04-24 15 views
6

मेरे पास एक डब्ल्यूसीएफ सेवा है और हमने अभी तक एक व्यापार वस्तु के लिए एक डीटीओ बनाया है।डेटा ट्रांसफर ऑब्जेक्ट्स - डीटीओ में या व्यापार ऑब्जेक्ट में मैपिंग करें?

मेरा प्रश्न है कि दोनों के बीच मैपिंग कहां रखा जाए?

ए) डीटीओ में?

public class PersonDTO 
{ 
    [DataMember] public string Id    { get; set; } 
    [DataMember] public string Name   { get; set; } 

    public void CloneFrom(Person p) 
    { 
     Id = p.Id; 
     Name = p.Name; 
    } 

    public void Populate(Person p) 
    { 
     p.Id = Id; 
     p.Name = Name; 
    } 
} 

या

बी) व्यापार वस्तु में?

public class Person 
{ 
    public string Id    { get; set; } 
    public string Name   { get; set; } 

    public void CloneFrom(PersonDTO dto) 
    { 
     Id = dto.Id; 
     Name = dto.Name; 
    } 

    public PersonDTO GetDTO() 
    { 
     return new PersonDTO() 
     { 
      Id = Id; 
      Name = Name; 
     } 
    } 
} 

मैं एक में चिंताओं की जुदाई (बिजनेस वस्तु DTOs का ज्ञान नहीं होता) की तरह है, लेकिन मैं बी के कैप्सूलीकरण (डीटीओ को व्यापार वस्तु हिम्मत का पर्दाफाश करने की कोई जरूरत नहीं) पसंद करते हैं।

बस आश्चर्य हुआ कि क्या मानक तरीका था?

उत्तर

11

मुझे लगता है कि यह एक अलग वर्ग के लिए कॉल करता है, क्योंकि न तो बीओ और न ही डीटीओ को किसी अन्य वर्ग में उनके परिवर्तन से संबंधित होना चाहिए।

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

यदि आप स्वयं को मानचित्र बनाना चाहते हैं, तो आप मैपिंग कार्यान्वयन को अपने डीटीओ और बीओ कक्षाओं से अलग रखने के लिए अभी भी विस्तार विधियों का उपयोग कर सकते हैं।

+0

वास्तव में? यदि मैं अपनी व्यावसायिक वस्तु का पर्दाफाश करने जा रहा हूं ताकि एक तीसरी कक्षा मैपिंग करने की अनुमति दे, मैं इसे डीटीओ में भी कर सकता हूं। अभी तक एक और कक्षा बनाना मेरे लिए बहुत अधिक लगता है। हालांकि, मैं ऑटोमैपर पर एक नज़र डालेगा, धन्यवाद। – GazTheDestroyer

+4

@GazTheDestroyer: एक डीटीओ डेटा हस्तांतरण के लिए परिवर्तित नहीं है। एक डीटीओ अपने उपयोग के बारे में पता नहीं है i.e: मैपिंग्स। यह डेटा को स्थानांतरित करता है और यह उपभोक्ता पर निर्भर करता है कि डेटा का उपयोग किसी भी उद्देश्य के लिए करें यानी: उदाहरण के लिए इसे व्यूमोडेल पर मैप करें। आप डीटीओ में मैपिंग जोड़ने के लिए स्वतंत्र हैं लेकिन मेरी विनम्र राय में इसका मतलब है कि हालांकि आप डीटीओ के इरादे के उद्देश्य से चूक रहे हैं और जैसे आपका डीटीओ अब डीटीओ नहीं है। हमारी वर्तमान परियोजना में एक भंडार संस्थाएं उत्पन्न करता है। बीएल इकाइयों को प्राप्त करता है, उन्हें डीटीओ को मानचित्रित करता है। यूआई परत क्वेरी बीएल, डीटीओ प्राप्त करता है और उन्हें ViewModels (आवश्यकतानुसार) पर मानचित्रित करता है। – Nope

1

मैं एक घटक परत का सुझाव दूंगा। यह आपकी व्यावसायिक परत और आपकी डेटा परत के बीच संचार के लिए जिम्मेदार होना चाहिए। इस मामले में, आप इसका उपयोग अपने डीटीओ ऑब्जेक्ट्स को बिजनेस ऑब्जेक्ट्स में अनुवाद करने के लिए कर सकते हैं।

+0

मेरे अनुभव में, जबकि नेटटायर्स के कुछ अच्छे गुण हैं, वास्तव में इसके साथ काम करना निराशाजनक हो सकता है, http://stackoverflow.com/questions/8220206/whither-nettiers –

+0

@DavidClarke मेरा संदर्भ मुख्य रूप से केवल परिभाषा के लिए था एक घटक परत। मेरे द्वारा प्रदान किया गया लिंक टूटा हुआ है, इसलिए मैं हटा दूंगा। :) – Khan

0

आप चिंता करते हैं "डीटीओ को व्यापार ऑब्जेक्ट गड़बड़ी का पर्दाफाश करने की कोई ज़रूरत नहीं है" ऐसा लगता है कि जब तक आप सार्वजनिक कोड तक पहुंच नहीं रहे हैं, तब तक आप कुछ कोड नहीं दिखा रहे हैं, यानी यह सब कुछ नहीं है।

के रूप में एक अलग रूप में, बजाय क्लोन तरीकों होने के आप के बजाय एक डाली ऑपरेटर को लागू कर सकते हैं: MSDN

इस तरह आप की तरह कुछ कर सकते हैं: व्यक्ति p = (व्यक्ति) myPersonDTO;

+0

हां, मेरा उदाहरण बहुत आसान था। हकीकत में मेरे व्यापार वस्तुओं में निजी सामान है जो मैं वास्तव में मानचित्रण उद्देश्यों के लिए खुलासा नहीं करना चाहता हूं। – GazTheDestroyer

+1

यदि बीओ पर सामान निजी/संरक्षित परिभाषित किया गया है तो इसका उपयोग करने वाले कुछ भी इसे नहीं देख पाएंगे, इसलिए सुनिश्चित नहीं है कि उस मोर्चे पर समस्या क्या होगी। – Peter

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