2010-03-22 7 views
12

मैं चार अलग-अलग परियोजनाओं का पुन: उपयोग नहीं करता है:WCF संदर्भित विधानसभाओं में प्रकार का पुन: उपयोग ServiceContract इंटरफ़ेस

  • MyUserControl - एक सेवा को लागू करने IMyService

  • MyService के लिए एक संदर्भ की जरूरत है - इम्प्लीमेन्ट्स IMyService

  • MySharedInterfaces - शामिल IMyUserControl और IMyService

  • MyWebApp

उपयोगकर्ता नियंत्रण गतिशील रूप क्रम में लोड किया जाना चाहिए। यह IMyUserControl लागू करता है और इसमें IMyService की एक संपत्ति है जो रनटाइम पर सेट की जाएगी।

मुसीबत भी प्रकार के पुन: उपयोग करने, MyWebApp IMyService इंटरफ़ेस पुन: उपयोग नहीं कर रहा है विकल्प के साथ है। यह हमेशा सेवा संदर्भ से इसे फिर से उत्पन्न करता है। यह कोई मुद्दा नहीं होगा अगर मैं इसे MySharedInterfaces.IMyService पर डाल सकता हूं, जिसे मैं समझ नहीं पा रहा हूं, क्योंकि यह बिल्कुल वही होना चाहिए।

उपयोगकर्ता नियंत्रण प्रकार IMyService की कुछ उम्मीद कर रही है। क्या का पुन: उपयोग करने के लिए पर MySharedInterface.IMyService पर या WebServiceReference को मजबूर करने के लिए वैसे भी है?

+0

सेवा संदर्भ जोड़ने के दौरान [मौजूदा प्रकारों का पुन: उपयोग करें "के संभावित डुप्लिकेट को अनदेखा किया जाता है] (http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-adding-a- सेवा -रेंफर) –

+0

देखें: http://stackoverflow.com/questions/3119329/wcf-service-reference-generates-its-own-contract-interface-wont-reuse-mine/17318813#17318813 –

उत्तर

16

मैट, आप निश्चित रूप से क्लाइंट-साइड प्रॉक्सी बनाने की "दो-चरणीय" प्रक्रिया कर सकते हैं - यह वास्तव में एक बड़ी बात नहीं है।

अपने क्लाइंट ऐप में, MySharedInterfaces असेंबली का संदर्भ लें। फिर, अपनी सेवा इंटरफेस के लिए ChannelFactory<T> का एक उदाहरण बनाने के लिए:

ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(); 

यह मूल रूप से एक कारखाने वर्ग जो तब अपने ग्राहक और अपने सर्वर के बीच वास्तविक communcations चैनल निर्माण करने में सक्षम है बनाता है। चूंकि इसे सेवा अनुबंध की आवश्यकता है, इसलिए यह विधि केवल तभी काम करती है जब आप सेवा अनुबंध असेंबली (जो आप कर सकते हैं और चाहते हैं, अपने मामले में) साझा कर सकते हैं।

यह एक काफी समय है- और संसाधन-महंगा कदम, इसलिए यदि संभव हो तो कारखाने को कहीं भी फैलाने का प्रयास करें और इसे फिर से बनाने के बजाय इसे पुन: उपयोग करें।

, अब आप अपने वास्तविक संचार चैनल है, जो मूल रूप से आपके प्रॉक्सी क्लाइंट Add Service Reference द्वारा उत्पन्न हो जाता है के बराबर है बना सकते हैं अपने चैनल कारखाने को देखते हुए:

IMyService client = factory.CreateChannel(); 

यह एक बहुत ही महंगा ऑपरेशन नहीं है, तो आप कर सकते थे सेवा कॉल करने से पहले हर बार ऐसा करें, और ग़लत चैनलों के बारे में चिंता न करें और आगे भी।

client भी ICommunicationObject इंटरफ़ेस लागू करता है, तो आप कुछ WCF संबंधित चैनल के राज्य की तरह जांच करने की जरूरत है, तो आप अपने ग्राहक डाली कर सकते हैं:

CommunicationState currentState = ((ICommunicationObject)client).State; 

तो तुम मूल रूप से वास्तव में सभी बिट्स है और आपके जेनरेट क्लाइंट प्रॉक्सी क्लास के टुकड़े, लेकिन आप जो कर रहे हैं उस पर आपका अधिक नियंत्रण है।

+0

कोड नमूने के लिए धन्यवाद, पूरी तरह से काम करता है। – Matt

4

क्या आपने MyUserControl में MySharedInterfaces का संदर्भ शामिल किया है? क्या MySharedInterfaces में अन्य असेंबली के लिए कोई संदर्भ है, जिन्हें MyUserControl में संदर्भित नहीं किया गया है?

कठिन तरीका उत्पन्न सेवा संदर्भ का उपयोग नहीं कर रहा है और चैनलफ़ैक्टरी का उपयोग नहीं कर रहा है। यह आपको हमेशा MySharedInterfaces से इंटरफ़ेस देता है।

+0

त्वरित उत्तर के लिए धन्यवाद। MyUserControl प्रोजेक्ट MySharedInterfaces का संदर्भ देता है, और MySharedInterfaces द्वारा संदर्भित कुछ भी नहीं है जिसे MyUserControl द्वारा संदर्भित नहीं किया गया है। फिलहाल यह अवधारणा का प्रमाण है, इसलिए इस समय यह बहुत खाली है। पिछले हफ्ते मैंने पहली बार डब्ल्यूसीएफ को देखा था, इसलिए यह शुरू करने के लिए आसान सामान से चिपकने की उम्मीद कर रहा था। हालांकि मुझे चैनलफैक्टरी पर पढ़ा जाएगा। जिज्ञासा से बाहर, यह IMyServiceInterface का पुन: उपयोग क्यों नहीं कर सकता है जब यह सब कुछ पुन: उपयोग कर सकता है? – Matt

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