2008-10-21 12 views
5

के साथ इकाइयों के लिए लिंक मेरे पास मेरी सभी इकाइयां मेरी एडीएमएक्स फ़ाइल में एक अलग परियोजना में हैं और मैं उन्हें डब्ल्यूसीएफ सेवा का उपयोग करके अपने क्लाइंट एप्लिकेशन में बेनकाब करता हूं।डब्ल्यूसीएफ

इसका मतलब है कि मुझे अपने क्लाइंट ऐप को उस परियोजना के लिए एक सीधा लिंक नहीं देना है जिसमें edmx फ़ाइल है। यह बुरा होगा क्योंकि यह डेटाबेस को क्वेरी करने के लिए ऑब्जेक्ट को नियंत्रित करता है।

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

myServiceInstance.MyClass cls = new myServiceInstance.MyClass() 

के बारे में अगर मैं एक इकाई है कहा जाता है क्या:

public MyClass GetMyClass() 
{ 
    return new MyClass(); 
} 

.. मैं की तरह कुछ के साथ अपने ग्राहक अनुप्रयोग में पहुँच MyClass उपयोग कर सकते हैं MyClass2 मेरी edmx फ़ाइल में जो मैं अपने क्लाइंट ऐप में उपयोग करना चाहता हूं! मैं अपने क्लाइंट को मेरे एडीएमएक्स फ़ाइल प्रोजेक्ट के लिए सीधा लिंक देकर या मेरी सेवा परत में एक बेकार विधि बनाने के बिना इसे कैसे इंस्टेंस कर सकता हूं जो MyClass2

अन्य लोग क्या कर रहे हैं?

धन्यवाद एक बहुत

+0

यदि आप एक अलग, अधिक भिन्न प्रारूप में कोड स्निपेट प्रदर्शित करना चाहते हैं, तो अपना प्रश्न संपादित करें, कोड टेक्स्ट का चयन करें और विशाल उद्धरण के बगल में 01010 के साथ आइकन पर क्लिक करें। – DOK

उत्तर

2

WCF सेवा के लिए इसका इस्तेमाल नहीं करता है, क्या आप इसके लिए चाहेगा? एक डब्ल्यूसीएफ सेवा (स्वयं) पूरी तरह से डेटा परिवहन के लिए है - मेटाडाटा के लिए "मेक्सिको" दृष्टिकोण कोड साझा नहीं करता है, इसलिए आपका MyClass2 नपुंसक होगा। यदि आप चाहते हैं, तो आप ग्राहक पर असेंबली साझाकरण का उपयोग कर सकते हैं, लेकिन मैं वास्तव में इस मामले में इसकी अनुशंसा नहीं करता; क्लाइंट पर ईएफ ऑब्जेक्ट्स एक गड़बड़ है ... (प्लस यह हल्के ढांचे जैसे सिल्वरलाइट, क्लाइंट प्रोफाइल, कॉम्पैक्ट फ्रेमवर्क इत्यादि पर काम नहीं करेगा)

एक और विकल्प ADO.NET Data Services है; यह डब्ल्यूसीएफ पर काम करता है, लेकिन आपको नियमित डब्ल्यूसीएफ दृष्टिकोण की तुलना में अधिक LINQ- अनुकूल API देता है - और आपके मॉडल का खुलासा करने वाले किसी भी डोमेन ऑब्जेक्ट क्लाइंट डेटा-संदर्भ पर उपलब्ध होना चाहिए।

3

हम डोमेन स्थानांतरण वस्तु वर्ग है कि हमारे विभिन्न आंतरिक WCF सेवाओं के लिए डाटा संविदा के रूप में सेवा के साथ एक अलग परियोजना बनाया। फिर हमने उन आंतरिक सेवाओं के साथ अनुबंध परियोजना साझा की। हमारे पास एक डेटा सेवा थी; उन विधियों को संग्रहीत/पुनर्प्राप्त करने से पहले/बाद में इन ऑब्जेक्ट ऑब्जेक्ट्स को इकाई ऑब्जेक्ट्स में/से अनुवादित किया जाएगा। इस बीच, बाहरी सेवाओं ने एक्सएसडी और डब्लूएसडीएल फाइलों से उत्पन्न मानक प्रॉक्सी का उपयोग किया, और साझा डोमेन स्थानांतरण मॉडल में/से अनुवाद किया।

हमें ऐसा करना पड़ा क्योंकि ऑब्जेक्ट संदर्भ दुर्भाग्य से WCF पर पोर्टेबल नहीं है (अभी तक)।

अपनी स्थिति के लिए कुछ विचार:

  1. तो अपने क्लाइंट ऐप बाहरी आपके सिस्टम के लिए है, यह आपके edmx या उसके कक्षाओं के बारे में कुछ भी पता नहीं करना चाहिए। इसे केवल आपके डब्लूएसडीएल और एक्सएसडी के बारे में पता होना चाहिए।
  2. यदि आपका ग्राहक ऐप आंतरिक है, तो यह इकाई वर्गों को ईएफ v1 में साझा करने का प्रयास करने का कोई उपयोग नहीं है क्योंकि यह ठीक से समर्थित नहीं है। आपको केवल कक्षाओं/वस्तुओं से अधिक स्थानांतरित करने की आवश्यकता है - आपको संदर्भ की भी आवश्यकता है, जो परिवर्तन ट्रैकिंग को बनाए रखता है, और इसे सीधे डब्लूसीएफ के माध्यम से नहीं किया जा सकता है।
1

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

इसे संभालने का एक और तरीका केवल svcutil (या "सेवा संदर्भ जोड़ें ..." का उपयोग करना है, हालांकि svcutil एकाधिक सेवा अंतराल के लिए बेहतर काम करता है) क्लाइंट का उपयोग करने के बजाय क्लाइंट का उपयोग करने वाले सभी वर्गों को उत्पन्न करने के लिए सर्वर परियोजना। इस तरह, आपके क्लाइंट को देखे जाने वाले एकमात्र वर्ग सेवा द्वारा उजागर किए गए हैं।