2011-06-11 12 views
8

पर प्रतिबिंबित नहीं होता है, जब मुझे क्लाइंट पर डेटाकंट्रैक्ट का उदाहरण बनाते हैं तो मुझे कुछ डेटा सदस्यों को कुछ मान प्राप्त करने की आवश्यकता होती है। यह रचनाकारों का उपयोग नहीं हो रहा है। मैंने विभिन्न मंचों के माध्यम से खोज की है और पाया है कि हमें [ऑनडिसेरियलाइजिंग] और [ऑनडिसेरियलाइज्ड] विशेषताओं का उपयोग करना होगा। यह भी काम नहीं कर रहा है। क्या कोई यहां कुछ सुझाव दे सकता है। दूसरा विकल्प ग्राहक पक्ष में आंशिक कक्षाओं में रचनाकार बना रहा है। मैं इससे बचना चाहता हूं।डब्ल्यूसीएफ डाटाकंट्रैक्ट में कन्स्ट्रक्टर क्लाइंट

कृपया नीचे दिए गए कोड:

सर्वर साइड: Datacontract

[DataContract] 
public class Account 
{ 

    private int mAccountId; 
    private string mAccountName; 

    public Account() 
    { 
     mAccountId = 5; 
     mAccountName = "ABC"; 
    } 

    [OnDeserializing] 
    public void OnDeserializing(StreamingContext context) 
    { 
     mAccountId = 5; 
     mAccountName = "ABC"; 
    } 

    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 

    } 

    [DataMember] 
    public int AccountId 
    { 
     get 
     { 
      return mAccountId; 
     } 
     set 
     { 
      mAccountId = value; 
     } 
    } 

    [DataMember] 
    public string AccountName 
    { 
     get 
     { 
      return mAccountName; 
     } 
     set 
     { 
      mAccountName = value; 
     } 
    } 


} 

क्लाइंट साइड - प्रारंभ

namespace TestClient 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      Account acc = new Account(); 

     } 
    } 
} 
+0

डब्ल्यूसीएफ क्लाइंट-सर्वर कनेक्शन ** केवल ** आपके डेटा अनुबंधों के डेटा पहलुओं को दर्पण करेगा - ** नहीं ** आपके डेटा वर्गों में आपके पास कोई भी कोड हो सकता है। आखिरकार: केवल डेटा को एक्सएसडी (एक्सएमएल स्कीमा) द्वारा प्रस्तुत प्रारूप में क्रमबद्ध किया जा सकता है और तार में भेजा जाता है - कोई कोड नहीं। –

उत्तर

14

कोड WCF प्रॉक्सी वर्गों बनाने के लिए इस्तेमाल जनरेटर संगत अनुबंध के प्रकार बनाता है , और डब्ल्यूसीएफ सेवा द्वारा उपयोग किए जाने वाले सटीक उसी प्रकार का उपयोग नहीं करता है। WCF

partial class Account 
{ 
    public Account() 
    { 
     AcountId = 5; 
     AccountName = "ABC"; 
    } 
} 

यदि आप ऐसा करना नहीं चाहते हैं, तो आप प्राप्त कर सकते हैं प्रकार के पुन: उपयोग करने: सबसे आसान तरीका प्राप्त करने के लिए आप क्या चाहते हैं,, के रूप में उत्पन्न कोड partial है अपने ग्राहक पर निर्माता अपने आप को बनाने के लिए है जो पहले से ही आपके क्लाइंट प्रोजेक्ट द्वारा संदर्भित हैं। इसलिए यदि आपका डेटा अनुबंध वर्ग अलग पुस्तकालय में है (जैसा कि अनुशंसित है), तो आप उस लाइब्रेरी का संदर्भ दे सकते हैं और फिर संदर्भित असेंबली से साझा प्रकारों का पुन: उपयोग करने के लिए अपने डब्ल्यूसीएफ क्लाइंट प्रोजेक्ट को फिर से कॉन्फ़िगर कर सकते हैं।

+0

कोई अन्य कामकाज? [ऑनडिसेरियलाइजिंग]/[ऑनडिसेरियलाइज्ड] विशेषताएं क्यों काम नहीं कर रही हैं ..... धन्यवाद ... – Subhasis

+0

क्योंकि वे गुण deserialization के लिए हैं = जब आपको सेवा से 'खाता' मिलता है जब आप कन्स्ट्रक्टर को कॉल नहीं करते हैं! –

+2

+1 किसी अन्य लाइब्रेरी में डेटाकंट्रैक्ट कक्षाओं को डालने के लिए। हमने उन्हें पुस्तकालय में सेवा इंटरफेस परिभाषा के साथ रखा है, और हकीकत में संचार अनुबंध एक सेवा चिंता है, न कि डोमेन मॉडल की चिंता। –

13

गुण DataMember गुणों के साथ जिम्मेदार गुण केवल परिभाषित करते हैं कि जेनरेट डब्लूएसडीएल/एक्सएसडी में क्या शामिल किया जाएगा। क्लाइंट सेवा के साथ संचार के लिए उपयोग करने के लिए wsdl/xsd पर आधारित अपने स्वयं के कक्षाएं उत्पन्न करेगा। यह उसी कक्षाओं का उपयोग नहीं करता है जो सर्वर पर उपयोग किए जाते हैं।

यह वह जगह है तुम क्यों नहीं मिलेगा:

  • किसी भी कंस्ट्रक्टर्स DataContract वर्ग में परिभाषित
  • किसी भी निजी [DataMember] गुण/क्षेत्रों (ग्राहक हमेशा सार्वजनिक गुण/क्षेत्रों उत्पन्न होगा)
  • किसी भी व्यवहार DataContract कक्षा

उस परिदृश्य की कल्पना करें जहां एक जावा क्लाइंट आपकी सेवा से कनेक्ट होना चाहता है। क्या आप एक ही निर्माता के साथ जावा वर्गों को उत्पन्न करने की उम्मीद करते हैं? [OnDeserialized] विशेषताओं के साथ क्या? जावा स्क्रिप्ट क्लाइंट, या पायथन क्लाइंट के बारे में क्या?

जब आप इस बारे में सोचना शुरू करते हैं तो आप यह देखना शुरू कर देते हैं कि आप जो चाहते हैं वह नहीं हो सकता है (कम से कम क्लाइंट और सर्वर के बीच पुस्तकालयों को साझा किए बिना)।

वास्तविकता यह है कि आप क्लाइंट को कक्षाएं रखने के लिए मजबूर नहीं कर सकते हैं, जिनके पास हमेशा डिफ़ॉल्ट मान होते हैं और आप क्लाइंट के लिए हमेशा वैध डेटा वापस भेजने के लिए नहीं कर सकते हैं, ग्राहक हमेशा एक संदेश भेज सकता है जिसमें कचरा होता है। IsRequired और 'EmitDefaultValue` के साथ संदेश के कुछ पहलुओं पर आपका थोड़ा नियंत्रण है जो संदेश में कुछ मौजूद है, यह सुनिश्चित करने के लिए xsd में चेक जोड़ देगा, लेकिन आपको सर्वर पर सत्यापन करना होगा, आप नहीं कर सकते मान लें कि आपके द्वारा वापस आने वाली वस्तुओं को सत्यापित किया जाएगा।

मेरा सुझाव तारों को भेजने के लिए आपके डोमेन ऑब्जेक्ट्स से डीटीओ बनाना होगा, जिसमें किसी भी प्रकार की जांच नहीं होगी, वे डेटा रखने के लिए केवल साधारण बैग हैं। फिर अपने डोमेन ऑब्जेक्ट्स को डीटीओ और डीटीओ में क्लाइंट ऑब्जेक्ट्स में बदलने के लिए कारखानियां बनाएं। कारखाना बस डीटीओ लेता है और सदस्यों को डोमेन ऑब्जेक्ट के निर्माता में पास करता है। फिर आपका सत्यापन तर्क डोमेन ऑब्जेक्ट के कन्स्ट्रक्टर में रह सकता है जहां यह संबंधित है। वर्तमान में आपके दृष्टिकोण के साथ आप संभवतः सत्यापन को घुमाएंगे ताकि यह दोनों कन्स्ट्रक्टर और [ऑनडिसेरियलाइज्ड] विधि से किया जा सके।

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