2009-07-13 14 views
7

वी.एस. 2008 & .NET 3.5 SP1 का उपयोग करना:WCF, इकाई की रूपरेखा और डेटा संविदा

मैं WCF का उपयोग कर रहा ग्राहकों के लिए एक सेवा है कि पढ़ता है और इकाई की रूपरेखा का उपयोग कर डेटाबेस प्रविष्टियों लिखते से कनेक्ट करने की अनुमति के लिए। डिफ़ॉल्ट रूप से डेटाबेस से स्वचालित रूप से जेनरेट की गई इकाइयां डेटाकंट्रैक्ट विशेषता लागू होती हैं।

दुर्भाग्यवश कई क्षेत्रों का खुलासा क्लाइंट द्वारा खपत के लिए नहीं है (यानी - कौन से डेटा तक पहुंच रहा है) के रिकॉर्ड और सुरक्षा कारणों से मैं उन्हें उजागर होने से रोकूंगा। क्या इस तरह से प्रकट होने से एंटिटी फ्रेमवर्क कक्षाओं से बचने का कोई तरीका है?

नोट: यह How to prevent private properties in .NET entities from being exposed as public via services? का डुप्लिकेट नहीं है। उस प्रश्न में उपयोगकर्ता कुछ क्षेत्रों को चुनिंदा रूप से प्रदर्शित करना चाहता है, जबकि मैं चाहता हूं कि इकाई को डेटाकंट्रैक्ट के रूप में प्रकट न किया जाए।

अग्रिम धन्यवाद।

+0

यह किसी अन्य पोस्टिंग के समान हो सकता है जिसका उत्तर पूरी तरह से नहीं दिया गया था: 'wcf और ADO इकाई ढांचा', http://stackoverflow.com/questions/828302/wcf-and-ado-entity-framework – Malcolm

+0

मैं सहमत हूं आपके द्वारा दिए गए "डब्ल्यूसीएफ और एडीओ इकाई ढांचे" लिंक पर उत्तर दें। या आप कुछ प्रकार के भंडार पैटर्न को लागू कर सकते हैं। – NikolaiDante

+1

@ नाथ - मैं निश्चित रूप से "डब्ल्यूसीएफ और एडीओ इकाई ढांचे" के उत्तर से सहमत हूं, लेकिन दुर्भाग्य से यह मेरी समस्या का समाधान नहीं करता है। उत्तर में पहला बिंदु "ऑटो जेनरेट इकाई फ्रेमवर्क इकाइयां" है, जो उस डेटा को बेनकाब करेगा जिसे मैं डेटाकंट्रैक्ट के रूप में निजी रखना चाहता हूं। एक रिपोजिटरी पैटर्न में एक ही समस्या होगी यदि इसे ईएफ मॉडल द्वारा समर्थित किया गया था - जब तक कि मुझे कुछ याद नहीं आ रहा है? – Malcolm

उत्तर

13

आप जानते हैं कि आपके संस्थाओं डेटाबेस के साथ एक करने के लिए एक नक्शा करने की जरूरत नहीं कर रहे हैं? विशेष रूप से, आप कॉलम, या यहां तक ​​कि पूरी सारणी भी छोड़ सकते हैं जो प्रासंगिक नहीं हैं।

इकाई मॉडल एक वैचारिक मॉडल करने के लिए है। आप आसानी से ग्राहकों में से एक सेट (वेब ​​सेवाओं, शायद), और एक और सेट, एक ही डेटाबेस के लिए मानचित्रण के लिए जोखिम के लिए संस्थाओं का एक सेट बना सकते हैं, कि एक अलग ग्राहक के लिए (वेब ​​अनुप्रयोग, शायद) है।

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

  • EntityKeyMember
  • StructuralObject
  • EntityObject
  • EntityKey
  • EntityReference
  • RelatedEnd

ये नहीं बातें अपने ग्राहकों रहे हैं के बारे में जानने की जरूरत है।

मैं डेटा ट्रांसफर ऑब्जेक्ट्स को उजागर करना पसंद करता हूं, और गुणों को एक से दूसरे में कॉपी करता हूं। जाहिर है, हाथ से तुलना में प्रतिबिंब या कोड पीढ़ी के माध्यम से यह बेहतर होता है। मैंने इसे अतीत में कोड पीढ़ी के माध्यम से किया है (टी 4 टेम्पलेट्स)।

एक विकल्प मैंने कोशिश नहीं की है AutoMapper

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, जॉन। हां, मुझे पता है कि इकाइयों को एक-दूसरे को मैप करने की आवश्यकता नहीं है और वैचारिक मॉडल का सबसेट मॉडल कर सकते हैं, लेकिन मुझे नहीं लगता कि इससे मुझे वह परिणाम मिलेगा जो मैं उम्मीद कर रहा हूं। यहां एक उदाहरण है: मान लीजिए कि मेरे पास एकाउंटिंग सिस्टम में खातों की एक तालिका है, और मैं लेखा परीक्षा करना चाहता हूं कि कौन से खाते पर खाते हैं। मुझे खाता तालिका से फ़ील्ड का पर्दाफाश करने की ज़रूरत है, लेकिन मैं नहीं चाहता कि मेरा संभावित धोखाधड़ी यह देखने के लिए कि मैं अपने कार्यों के बारे में क्या जानकारी देख रहा हूं। अगली टिप्पणी में जारी ... – Malcolm

+0

... पिछली टिप्पणी से जारी है। जब ग्राहक फ़ंक्शन को कॉल करता है तो मैं एक रिकॉर्ड बनाना चाहता हूं और उसे ट्रैकिंग और विश्लेषण के लिए अपनी ऑडिट तालिका में डाल देना चाहता हूं। मैं ईएफ के माध्यम से दोनों accesible होना चाहते हैं (चाहे वे एक ही या अलग इकाई कंटेनरों में हैं मेरे लिए महत्वपूर्ण नहीं है)। दुर्भाग्य से जो भी मैं डेटा मॉडल के हिस्से के रूप में परिभाषित करता हूं उसे डेटाकंट्रैक्ट के रूप में उजागर किया जाता है। – Malcolm

+0

तो, उस डेटा मॉडल का पर्दाफाश न करें। एक छोटा डेटा मॉडल एक्सपोज़ करें - जिसे आप उजागर करना चाहते हैं। जैसा कि आप ऑडिटिंग सिस्टम में करते हैं, वैसे ही संभावित धोखेबाज को उसी मॉडल का पर्दाफाश न करें। –

3

हम DataContract वस्तुओं के लिए अलग वर्ग का उपयोग करें। हमारे पास एक विधि, ToContract() के साथ एक इंटरफ़ेस है, और हमारी सभी संस्थाएं इस इंटरफ़ेस को आंशिक श्रेणी फ़ाइल में लागू करती हैं। यह अतिरिक्त काम है, और यह बॉयलरप्लेट है, लेकिन हमें नियंत्रण की अलगाव और ग्रैन्युलरिटी प्राप्त करने का सबसे आसान तरीका लगता है।

2

मैं मूल रूप से दो बातें आप कर सकते हैं देखें:

  1. या तो आप उन वस्तुओं आप मैन्युअल रूप से [DataMember] उन वस्तुओं पर विशेषता को हटाने के द्वारा DataContract से बेनकाब करने के लिए नहीं करना चाहती निकालना; उस मामले में, WCF बाहर
  2. गुण को क्रमानुसार नहीं होगा तुम बस उन सदस्यों आप चाहते हैं के साथ अपने स्वयं WCF DataContract वर्गों को परिभाषित, और आप अपने एफई संस्थाओं से अपने WCF DataContract कन्वर्ट करने के लिए एक तर्क के साथ आने, उदा का उपयोग कर ईएफ और डब्ल्यूसीएफ इकाइयों के बीच कठिन परिश्रम संचालन को खत्म करने (या कम से कम सीमित) करने के लिए AutoMapper जैसे कुछ।

मार्क

+0

धन्यवाद, marc_s। उपरोक्त बिंदु 1 के संबंध में, मैं उन आइटम्स से मैन्युअल रूप से जेनरेट की गई [डेटामेम्बर] विशेषता को मैन्युअल रूप से कैसे हटा सकता हूं? प्रत्येक बार जब मैं डेटाबेस से मॉडल अद्यतन करता हूं तो क्या मैन्युअल पुनर्विक्रय की आवश्यकता होगी? – Malcolm

+0

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

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