2010-09-28 13 views
7

लागू करने के लिए वेब सेवा प्रॉक्सी क्लास वेब वेब एक्सेस (डब्ल्यूसीएफ) के लिए जेनरेट प्रॉक्सी क्लास को एक सामान्य इंटरफ़ेस को लागू करने का एक तरीका ढूंढ रहा हूं ताकि वेब सेवा एक्सेस और "प्रत्यक्ष" पहुंच के बीच आसानी से स्विच किया जा सके। क्लाइंट अनुप्रयोग में व्यापार परत, की तरह कुछ:इंटरफ़ेस

public IBusiness GetBusinessObject() 
{ 
    if (_mode = "remote") 
    return new BusinessWebService.Business(); // access through web service proxy class 
    else 
    return new Business(); // direct access 
} 

हालांकि, कस्टम प्रकार (उदाहरण के लिए नीचे दिए गए उदाहरण में CustomSerializableType) उत्पन्न प्रॉक्सी कक्षा में संदर्भित नहीं हैं। इसके बजाय नए, समान प्रकार उत्पन्न होते हैं, जो प्रॉक्सी क्लास को इंटरफ़ेस को कार्यान्वित करने के लिए असंभव बनाता है।

क्या जेनरेट प्रॉक्सी क्लास इन प्रकारों को संदर्भित करने का कोई तरीका है, या क्या मैं इस सब गलत के बारे में जा रहा हूं? क्या मुझे वेब सेवा को डब्लूसीएफ सेवा में परिवर्तित करने पर विचार करना चाहिए?


जानकारी

हमारा समाधान इन चार परियोजनाओं के होते हैं:

  • एक व्यापार पुस्तकालय (, व्यावसायिक तर्क होता है accesses आंकड़ों की दुकान)
  • एक आम पुस्तकालय (आम होता है कार्यक्षमता, CustomSerializableType सहित)
  • एक वेब सेवा

    • स्थानीय मोड: उपाध्यक्ष
    • एक विंडोज़ अनुप्रयोग

    हमारे ग्राहक खिड़कियों आवेदन दो भिन्न मोड में चलाने के लिए सक्षम होना चाहता है (दूरस्थ क्लाइंट और व्यापार परत बीच प्रॉक्सी के रूप में कार्य करता है) , जहां एप्लिकेशन डेटा

  • रिमोट मोड तक पहुंचने के लिए सीधे व्यवसाय लाइब्रेरी का उपयोग करता है, जहां डेटा
तक पहुंचने के लिए वेब सेवा के साथ संचार करता है

ऐसा करने के लिए, हमने एक इंटरफ़ेस बनाया है, IBusiness, जो सामान्य पुस्तकालय में स्थित है और इसमें सभी व्यावसायिक विधियां हैं।

इंटरफ़ेस

public interface IBusiness 
{ 
    CustomSerializableType DoSomeWork(); 
} 

व्यापार परत

public class Business : IBusiness 
{ 
    public CustomSerializableType DoSomeWork() 
    { 
    // access data store 
    } 
} 

वेब सेवा

public class WebServiceBusiness : IBusiness 
{ 
    private Business _business = new Business(); 

    [WebMethod] 
    public CustomSerializableType DoSomeWork() 
    { 
    return _business.DoSomeWork(); 
    } 
} 

जनरेट किया गया प्रॉक्सी वर्ग (पठनीयता के लिए बाहर छोड़ दिया कोड की एक टन)

public partial class Business 
    : System.Web.Services.Protocols.SoapHttpClientProtocol 
{ 

    public CustomSerializableType DoSomeWork() 
    { 
    // ... 
    } 

    public partial class CustomSerializableType { 
    // PROBLEM: this new type is referenced, instead of the 
    // type in the common library 
    } 
} 
+0

क्या आप प्रॉक्सी कक्षाएं उत्पन्न करने के लिए svcutil.exe का उपयोग कर रहे हैं? –

+0

नहीं, फिलहाल मैं विजुअल स्टूडियो 2010 अंतर्निहित टूल्स का उपयोग कर रहा हूं। मैंने wsdl.exe के साथ थोड़ा सा गड़बड़ करने की कोशिश की, लेकिन यह मेरी समस्याओं का समाधान नहीं किया। Svcutil.exe एक बेहतर विकल्प है? क्या मुझे 'विरासत' वेब सेवाओं की बजाय डब्ल्यूसीएफ सेवाओं में अपग्रेड करने की आवश्यकता नहीं होगी? – bernhof

उत्तर

6

यह मानते हुए कि अपने ग्राहक के लिए डिफ़ॉल्ट नाम स्थान "ग्राहक" के बाद, और है कि आपके वेब संदर्भ "प्रॉक्सी" नाम दिया गया है, तो क्या करते हैं ;

  1. अपने क्लाइंट प्रोजेक्ट की जड़ में, "प्रॉक्सी" नामक फ़ोल्डर बनाएं।
  2. उस फ़ोल्डर में, "व्यवसाय" नामक एक कक्षा बनाएं।
  3. उस वर्ग सार्वजनिक और आंशिक बनाओ, और यह आपके IBusiness इंटरफ़ेस

लागू इस तरह है, तो आप Reference.cs संशोधित करने की जरूरत नहीं है। आपको कभी संदर्भ.cs, या कोड जनरेशन के माध्यम से उत्पादित किसी भी अन्य फ़ाइल को संशोधित करना चाहिए।

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

+0

लेकिन संदर्भ.cs में शामिल 'क्लोन' प्रकारों के बारे में क्या है (और कुछ मामलों में context.map के अंतर्गत। डेटा स्रोत फ़ाइलों के रूप में मौजूद हैं)? ये वर्ग प्रभावी ढंग से विधि हस्ताक्षर बदलते हैं ताकि वे इंटरफ़ेस में उनसे मेल न करें, जिससे मुझे इसे पहले स्थान पर लागू करने से रोक दिया जा सके। या मुझसे यहां कुछ छूट रहा है? – bernhof

+0

हाँ, आप कुछ याद किया! यदि प्रॉक्सी प्रकार इंटरफ़ेस से मेल नहीं खाते हैं, तो वे इंटरफ़ेस को कार्यान्वित नहीं कर सकते हैं। आपको अपने स्वयं के अलग-अलग सेट बनाना होगा जो _do_ इंटरफेस को कार्यान्वित करते हैं, लेकिन फिर वेब सेवा को उनके काम करने के लिए कहते हैं। यह वही है जो आप करेंगे यदि आप एक कार्यान्वयन के बीच स्विच करना चाहते थे जो डेटाबेस का उपयोग करता था और एक जो एक्सएमएल फ़ाइल का इस्तेमाल करता था। –

+0

इसलिए वेब सेवा को कॉल करने के लिए, मुझे इंटरफ़ेस द्वारा संदर्भित प्रकारों को मैन्युअल रूप से रूपांतरित करने की आवश्यकता है (उदा। 'Common.CustomSerializableType') प्रॉक्सी क्लास (उदा।' Proxy.CustomSerializableType') द्वारा उपयोग किए गए (क्लोन) प्रकारों में? – bernhof

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