2009-03-18 11 views
5

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

[DataContract] 
public class EnterpriseObject{ 
    [DataMember] 
    int ID{get; set;} 

    string InternalUse{get; set;} 
} 

[DataContract] 
public class ServiceObject: EnterpriseBaseObject{ 
    [DataMember]  
    string Address{get; set;} 
} 

यह संभव है केवल क्रमबद्धता में (EnterpriseObject से विरासत में मिली गुणों के साथ) ServiceObject बेनकाब? मैं नहीं चाहता कि ग्राहक एक विकल्प के रूप में सूचीबद्ध एंटरप्राइज़ ऑब्जेक्ट को देखना चाहें? जैसा कि आप उदाहरण में देख सकते हैं DataMember विशेषता InternalUser प्रॉपर्टी के लिए सेट नहीं है। क्या यह करने का एकमात्र तरीका है? धन्यवाद

उत्तर

7

आप जोड़ने एक [KnownType(typeof(ServiceObject))]EnterpriseBaseObject करने से विरासत को संभालने - हालांकि, EnterpriseBaseObject अभी भी अनुबंध का हिस्सा है, और अपने अस्तित्व सार्वजनिक की जाएगी। लेकिन केवल [DataMember] चिह्नित सदस्यों को प्रकाशित किया जाएगा।

एक विकल्प (विरासत को हटाने के लिए) क्रमबद्ध उद्देश्यों के लिए एक अलग डीटीओ होना है, और डीटीओ संस्करण और वास्तविक संस्करण के बीच एक रूपांतरण है - लेकिन यह अतिरिक्त काम करता है।

+0

इससे बहुत मदद मिली! – Slavo

2

क्या आप इसे एक पैटर्न के साथ एक पैटर्न में बदल सकते हैं? यदि ServiceObject में एंटरप्राइज़ ऑब्जेक्ट है तो आप केवल उन गुणों का पर्दाफाश कर सकते हैं जिन्हें आपको चाहिए।

संपादित

अगर मैं सही ढंग से समझ आप अपने सभी गुण (एक DataMember के रूप में चिह्नित कर रहे हैं यही कारण है कि) सहित ग्राहकों के लिए ServiceObject बेनकाब करना चाहते सहित गुण EnterpriseObject से विरासत में मिली। लेकिन आप नहीं चाहते कि ग्राहक यह जान सके कि एंटरप्राइज़ ऑब्जेक्ट नामक ऑब्जेक्ट है।

आप इस तथ्य को मजाक कर ऐसा कर सकते हैं कि एंटरप्राइज़ ऑब्जेक्ट है। "इज ए" रिलेशनशिप का उपयोग करने के बजाय एक विरासत पैटर्न है। आप एक रचना या "है ए" पैटर्न का उपयोग कर सकते हैं।

public class ServiceObject 
{ 
    private EnterpriseObject _myEntObject; 

    public string MyServiceObjectProperty 
    { 
     get; 
     set; 
    } 

    public string MyEntObjectProperty 
    { 
    get { return _myEntObject.MyEntObjectProperty;} 
    } 
} 

अब आपने अपने क्लाइंट से अपने एंटरप्राइज़ ऑब्जेक्ट को अलग कर दिया है। आपकी सभी संचार यह है कि ServiceObject में कुछ गुण हैं जो आप अपने क्लाइंट को नहीं उजागर कर रहे हैं कि यह किसी अन्य ऑब्जेक्ट द्वारा सर्वर पर लागू किया गया है।

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

+0

सुनिश्चित नहीं है कि आपका यहां क्या मतलब है। क्या आप समझाएँगे? – DDiVita

+0

मैं देख रहा हूं कि आप क्या कह रहे हैं। यह एक दिलचस्प दृष्टिकोण है! धन्यवाद! – DDiVita

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