2008-11-19 10 views
50

जब आप डब्लूसीएफ परियोजना बनाते हैं तो वीएसनेट एक टेम्पलेट बनाता है। एक WCF सेवा के बाद सेडब्ल्यूसीएफ में डेटाकंट्रैक्ट का क्या मतलब है?

// Use a data contract as illustrated in the sample below to 
// add composite types to service operations. 
[DataContract] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string stringValue = "Hello "; 

    [DataMember] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string StringValue 
    { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
} 

किसी भी उपयोगकर्ता परिभाषित वर्ग लौट सकते हैं, यही कारण है कि एक DataContract और CompositeType वर्ग का उपयोग करें:

यह iService1.cs फाइल करने के लिए एक वर्ग कहते हैं?

मैं की तरह कुछ लौट सकते हैं:

[OperationContract] 
MyUserCollection GetUsers(); 

मैं क्या याद आ रही है?

+19

आप तार के दोनों सिरों पर नेट है, तो है कि बस ठीक है। क्या होगा यदि आपके पास जावा क्लाइंट आपकी सेवा को कॉल कर रहा है? यदि आप डेटाकंट्रैक्ट्स के अंदर अपना डेटा डालते हैं, तो वह जानकारी डब्लूएसडीएल/एक्सएसडी मेटाडेटा में संग्रहीत होती है और इसका उपयोग .NET के अलावा अन्य ग्राहकों द्वारा भी किया जा सकता है। –

उत्तर

51

डेटाकंट्रैक्ट एक प्रकार की औपचारिक परिभाषा है जिसे सेवा सीमा के दोनों किनारों पर समझा जा सकता है।

यदि आप अपने उदाहरण के रूप में लौटते हैं, तो "MyUserCollection" ऑब्जेक्ट, आपकी सेवा के उपभोक्ताओं को आपकी सेवा/प्रणाली के अंदरूनी हिस्सों को संदर्भित करने की आवश्यकता होगी, जो स्पष्ट सीमाओं के एसओए सिद्धांत का उल्लंघन है। डेटाकंट्रैक्ट का उपयोग करके, आप अपने रिटर्न प्रकारों की संरचना को कम-से-कम तरीके से प्रकाशित कर रहे हैं।

+2

मेरे डब्ल्यूसीएफ को मेरे द्वारा लिखे गए ऐप्स द्वारा उपभोग किया जा रहा है, इसलिए सभी व्यावहारिक उद्देश्यों में यह ठीक होना चाहिए (एसओए को आवाज उठाने के लिए)। क्या आप सहमत हैं? – Blankman

+1

आप शायद कर सकते हैं, लेकिन आप क्यों चाहेंगे? विशेषता जोड़ना दर्द रहित है और डब्ल्यूसीएफ के साथ काम करने का अनुशंसित तरीका है। –

+0

स्कॉट, इसलिए मैं अपने MyUserCollection को कंपोजिट टाइप क्लास और बिंगो में जोड़ता हूं !? – Blankman

26

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

[DataContract] 
public class SampleClass 
{ 
    [DataMember(IsRequired=true)] 
    public int MyRequiredProperty { get; set; } 

    [DataMember] 
    public int MyOptionalProperty { get; set; } 

    public int MyInternalProperty { get; set; } 
} 

ऊपर के उदाहरण पर, आप परिभाषित है कि जब डेटा प्राप्त करने के लिए, आप चाहिए MyRequiredProperty है, और आप या MyOptionalProperty नहीं कर सकते। साथ ही, ग्राहक कभी भी MyInternalProperty नहीं देख पाएगा (यह उदाहरण के लिए कुछ संपत्ति हो सकती है जो आंतरिक रूप से आपके तर्क के साथ मदद करती है, लेकिन आप नहीं चाहते कि यह क्लाइंट स्तर पर उजागर हो)।

2

मैं पोस्टर से असहमत हूं, जिन्होंने कहा था "डेटाकंट्रैक्ट सिर्फ एक प्रकार की औपचारिक परिभाषा है जिसे सेवा सीमा के दोनों किनारों पर समझा जा सकता है।"

यहां कीवर्ड "प्रकार" है। .NET में, एक प्रकार एक ऑब्जेक्ट होता है जिसमें फ़ील्ड, गुण और विधियां हो सकती हैं। हालांकि, जब आप अपनी डब्ल्यूसीएफ सेवा में DataContract के साथ कक्षा को सजाने के लिए, परिणाम क्लास को जादुई रूप से कॉलिंग कोड में ट्रांसप्लांट नहीं किया जाता है; एक लंबे शॉट के द्वारा नहीं! कॉलिंग कोड में, आपके पास "प्रॉक्सी" कक्षा होगी। प्रॉक्सी क्लास XML प्राप्त करता है जो डेटा अनुबंध की सामग्री का प्रतिनिधित्व करता है। कॉलिंग कोड इन एक्सएमएल मानों को प्रॉक्सी क्लास के माध्यम से प्राप्त कर सकता है, लेकिन यह datacontract के साथ सजाए गए वर्ग के अंदरूनी हिस्सों तक कॉलिंग कोड पहुंच प्रदान करता है।

+0

आपका कथन "एक प्रकार एक वस्तु है" भ्रमित और भ्रामक है। ऑब्जेक्ट एक प्रकार का प्रकार है, क्योंकि इंटीग्रर्स और स्ट्रिंग्स प्रकार हैं। बस स्पष्टता के लिए, टाइप एक ऑब्जेक्टिफायर है जिसमें ऑब्जेक्ट एक है, दूसरा स्ट्रिंग है, जैसे इंटीजर, बूलियन इत्यादि – htm11h

2

"marc_s" करने के लिए जवाब देने के लिए:

"आप तार के दोनों सिरों पर नेट है, तो है कि बस ठीक है आप अपने सेवा को फोन एक जावा ग्राहक अगर तुम क्या है।? अपने डेटा को डेटाकंट्रैक्ट्स के अंदर रखें, उस जानकारी को डब्लूएसडीएल/एक्सएसडी मेटाडेटा में संग्रहीत किया जाता है और .NET के अलावा अन्य ग्राहकों द्वारा भी उपयोग किया जा सकता है। "

मुझे लगता है कि यह गलत है।के ऐसा करने के लिए कोशिश करते हैं:

  1. साथ DataContract सदस्यों पर कक्षाएं और DataMember पर जिम्मेदार बताते हैं एक वर्ग है, और एक विधि है जो इस प्रकार के रिटर्न के साथ WCF परियोजना के डिफ़ॉल्ट उदाहरण का उपयोग करें।
  2. इसे बनाएं और wsdl प्रदर्शित करें। Xsd में कंपोजिट टाइप टाइप परिभाषा है। ठीक।
  3. अब सभी गुणों को हटाएं डेटाकंट्रैक्ट और डेटामेम्बर
  4. इसे बनाएं और wsdl प्रदर्शित करें। Xsd में अभी भी कंपोजिट टाइप टाइप परिभाषा है! (यह एससीएम सॉफ्ट के साथ अधिक स्पष्ट है, जो चरण 2 और 4 के बीच फ़ाइलों में कोई फर्क नहीं पड़ता)

तो जावा क्लाइंट को डेटाकंट्रैक्ट और डेटामेम्बर के बिना इसका प्रबंधन करना चाहिए! क्या मैं गलत हूँ या क्या?

+2

आप गलत नहीं हैं, वाल्टर। (मैं बच्चा, मैं बच्चा) सौदा यह है कि आपके उपभोक्ता को अभी भी प्रारूप जानने की जरूरत है, सही? यदि आप दोनों तरफ .NET-land में हैं, तो आप ऑब्जेक्ट को संदर्भित करके ठीक हैं। आप जावा में एक .NET ऑब्जेक्ट आयात नहीं कर सकते [आसानी से], इसलिए आपको प्रारूप को किसी अन्य तरीके से बेनकाब करना होगा।यकीन नहीं है कि 4 क्यों सच होगा - मेरा मानना ​​है कि सौदा यह है कि इसे सही नहीं करना चाहिए? हालांकि स्वीकार्य रूप से मैं मुख्य रूप से यहां एल डुडरिनो को उद्धृत करने का मौका देता हूं। – ruffin

11

एक और महत्वपूर्ण उपयोग है, आप कक्षा और गुणों का नाम बदल सकते हैं। यह serialization और deserialization के दौरान एक आसान सुविधा है।

[DataContract(Name="EmployeeName")] 
public class Person 
{ 
    [DataMember(Name="FullName")] 
    public string Name { get; set; } 

    [DataMember(Name="HomeAddress")] 
    public string Address { get; set; } 
} 
0

शायद अक्सर उपयोग नहीं किया जाता है, हम निजी चर के माध्यम से पारित करने के लिए [DataContract] का उपयोग कर सकते हैं। DataContractSerializer यदि [DataContract] विशेषता का उपयोग नहीं किया जाता है तो केवल सार्वजनिक रूप से दृश्यमान प्रकारों को क्रमबद्ध/deserialize करेगा।

[DataContract] 
public class SampleClass 
{  
    [DataMember] 
    private int MyPrivateProperty { get; set; } 
} 

(नोट: यदि आप किसी प्रॉक्सी तो निजी सदस्यों सार्वजनिक रूप से उजागर कर रहे हैं पैदा कर रहे हैं तो)

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