2014-11-17 6 views
7

सबसे पहले, यह IEnumerable<T> as return type for WCF methods का डुप्लिकेट नहीं है, मुझे लगता है कि मैं समझता हूं कि डब्ल्यूसीएफ आर्किटेक्चर केवल ठोस प्रकारों को स्थानांतरित करने की अनुमति देता है जिसे एक संदेश में भर दिया जा सकता है।NetTcp बाइंडिंग डब्ल्यूसीएफ सेवा के साथ IENumerable <T> अर्थशास्त्र प्राप्त करना?

दूसरा, हमारे सेटअप तथापि नहीं एक सामान्य सेवा है, लेकिन के माध्यम से सी # + WCF + NetTcpBinding + Protobuf (केवल) कि कुछ इसलिए हम कुछ चाल के लिए अधिक स्थान हो सकता है की जरूरत है कि मालिकाना क्षुधा का एक बंडल अप जोड़ने अधिक बाध्यकारी तटस्थ होने के लिए।

तीसरा, यह न तो मेरा स्थान है और न ही यह प्रश्न एक अलग आरपीसी या मैसेजिंग फ्रेमवर्क का प्रस्ताव है।


"IEnumerable अर्थ विज्ञान", इस सवाल के प्रयोजन के लिए, कर रहे हैं:

  • लौटे अनुक्रम मनमाने ढंग से बड़ा हो सकता है - इसलिए यह संभव नहीं एक List के अनुक्रम में परिवर्तित करने के लिए है या इसी के समान।
  • यह पहले से ज्ञात नहीं कितने आइटम लौटा दी जाएगी
  • कोलर सिर्फ foreach उपयोग कर सकते हैं और इसके साथ किया जा रहा है।

एक स्थानीय विधानसभा में, एक सी # इंटरफ़ेस इस तरह मेरी नज़र:

interface IStuffProvider { 
    IEnumerable<Stuff> GetItems(); // may open large file or access database 
} 

आप एक WCF सेवा करने के लिए सीधे कि मैप नहीं कर सकते। कुछ ऐसा ही प्राप्त हो सकता है दिखाई देगा:

[ServiceContract(SessionMode = SessionMode.Required)] 
interface IStuffService { 
    [OperationContract] 
    void Reset(); // may open large file or access database 
    [OperationContract] 
    List<Stuff> GetNext(); // return next batch of items (empty list if no more available) 
} 

बेशक, IStuffService का उपयोग कर अधिक त्रुटि एक IStuffProvider से ग्रस्त हो सकता है और कई उपयोग परिदृश्यों से मिश्रण करने के लिए में जोड़ना होगा ही पर दोनों सेवा और ग्राहक का उपयोग शामिल होगा मशीन, इसलिए "उपयोगकर्ता कोड" के लिए यह जानना बहुत महत्वपूर्ण नहीं होगा कि "नेटवर्क" शामिल है, उपयोगकर्ता कोड सिर्फ एक साधारण इंटरफ़ेस में रूचि रखता है।

एक विकल्प क्लाइंट साइड इंटरफ़ेस रैपर कार्यान्वयन के लिए निश्चित रूप से होगा, जो IStuffProvider का खुलासा करता है और आंतरिक रूप से आगे बढ़ता है और IStuffService का उपयोग करता है। हालांकि, ऐसा लगता है कि यह वास्तव में को दो इंटरफेस बनाए रखने के लिए वांछनीय होगा, एक उपयोगकर्ता कोड के लिए, एक पूरी तरह से डब्ल्यूसीएफ संचार के लिए, विशेष रूप से क्योंकि इन अनुप्रयोगों को सभी कसकर जोड़ दिया जाता है, इसलिए अतिरिक्त अमूर्तता केवल ओवरहेड लगता है।

डब्ल्यूसीएफ के साथ हमारे पास क्या विकल्प हैं?


ध्यान दें कि यह पर पढ़ने के बाद, Streamed Binding एक गरीब समाधान लगता है, के रूप में मैं अभी भी ग्राहक की ओर एक आवरण की आवश्यकता होगी और सेवा इंटरफ़ेस में कोई वास्तविक लाभ के लिए और अधिक जटिल मिलेगा मेरी मामला: मुझे अधिकतम बाइनरी स्थानांतरण दक्षता की आवश्यकता नहीं है, मुझे अच्छा कार्यान्वयन + रखरखाव दक्षता चाहिए।

+5

शायद तुम [स्ट्रीमिंग कार्यक्षमता] (http://msdn.microsoft.com/en-us/library/ms733742 (v = vs.110) का उपयोग कर सकते हैं। एएसपीएक्स) कि provi है डब्ल्यूसीएफ द्वारा समर्पित? (मैंने थोड़ी देर के लिए डब्ल्यूसीएफ का उपयोग नहीं किया है, हालांकि, मुझे यकीन नहीं है कि यह उपयुक्त है ...) –

+0

@AasmundEldhuset - निश्चित रूप से एक सार्थक पढ़ा। ऐसा लगता है कि बहुत सारे स्ट्रिंग संलग्न हैं। –

+0

डब्ल्यूसीएफ इस तरह से होता है, है ना? ;-) –

उत्तर

0

मैं अंत में क्या किया है:

क) OO इंटरफ़ेसIStuffProvider के रूप में ऊपर के रूप में ऊपर GetLines() सदस्य के साथ।

[OperationContract] 
    ReadToken StartReadingLines(...); 

    [OperationContract] 
    // return next batch of items (empty list if no more available) 
    List<Stuff> ReadNextLines(ReadToken readToken); 

    [OperationContract] 
    void FinishReadingLines(ReadToken readToken); 

ग) ग्राहक एक प्रॉक्सी वर्ग कि IStuffProvider लागू करता है और के लिए एक कॉल के नक्शे के माध्यम से सेवा तक पहुँचता है:

ख) WCF सेवा इंटरफ़ेस (और यह कार्यान्वयन है) इस तरह एक पहुँच पैटर्न को लागू करता है ऊपर तीन कार्यों के लिए GetLines() समारोह:

// implementation in the proxy class: 
    public IEnumerable<Stuff> GetLines() 
    { 
     var readToken = _dataService.StartReadingLines(...); 
     try { 
      for (List<Stuff> lines = _dataService.ReadNextLines(readToken); lines.Count > 0; lines = _dataService.ReadNextLines(readToken)) { 
       foreach (var line in lines) { 
        yield return line; 
       } 
      } 
     } finally { 
      _dataService.FinishReadingLines(readToken); 
     } 
    } 
1

कुछ समय पहले हमें हमारी परियोजना में उसी डब्ल्यूसीएफ "प्रतिबंध" का सामना करना पड़ा था। कम होने के लिए, हम

interface IStuffProvider { 
    List<Stuff> GetItems(int page, int pageSize); // may open large file or access database 
} 

साथ समाप्त हो गया हाँ, यह IEnumerable<Stuff> GetItems(); के रूप में हाँ, हम मुसीबतों में प्राप्त कर सकते हैं जब कुछ आइटम जोड़ा/पर हटाया पहले से ही प्राप्त पेज समान नहीं है। हां, अगर सर्वर IEnumerable<Stuff> के मामले में आइटम के साथ काम करता है, तो कुछ सर्वर-साइड ट्वीक्स की आवश्यकता होती है। लेकिन यह अभी भी कड़ाई से टाइप किया गया है और क्लाइंट या सर्वर में ज्यादा अतिरिक्त तर्क नहीं लाता है।

+1

"कृपया ध्यान दें, यह सवाल का जवाब नहीं है, लेकिन कुछ आम विचार हैं।" - क्या इसे तब टिप्पणी के रूप में पोस्ट नहीं किया जाना चाहिए? –

+0

@DarrenYoung no –

+1

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। –

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