2014-10-24 10 views
7

में जेनेरिक हब का उपयोग कैसे करें मैं संस्करण 2.1.2 में सिग्नलआर का उपयोग कर रहा हूं। मैंने देखा है कि मेरे लिए उपयोग करने के लिए दो सार्वजनिक केंद्र कक्षाएं हैं, Hub और Hub<T>। पूर्व में एक एमएसडीएन पृष्ठ है जो पुराना प्रतीत होता है और बाद में किसी भी एमएसडीएन पृष्ठ की कमी नहीं होती है। मेरा मानना ​​है कि एमएसडीएन दस्तावेज न्यूजेट (जो मैं उपयोग कर रहा हूं) से सिग्नलआर के नवीनतम संस्करण के साथ अद्यतित नहीं है, क्योंकि रीशेर्पर की मदद से विभाजित स्रोतों में से दोनों वर्ग HubBase बेस क्लास से उत्तराधिकारी हैं। MSDN पृष्ठ की वंशानुगत पदानुक्रम अनुभाग Object से इनहेरिट और IHub और IDisposable इंटरफेस, तथापि decompiled स्रोतों, ऊपर उल्लिखित HubBase आधार वर्ग प्रकट IHub इंटरफ़ेस है जो बदले में लागू करता IDisposable को लागू करने को लागू करने के रूप में Hub वर्ग को दर्शाता है।सिग्नल

कक्षाओं की गैर सामान्य और सामान्य संस्करण के बीच अंतर यह है कि गैर-सामान्य व्यक्ति की Clients संपत्ति रिटर्न IHubCallerConnectionContext<dynamic> जबकि सामान्य संस्करण रिटर्न IHubCallerConnectionContext<T> टाइप किया था।

मैं अपने ग्राहकों को टाइप करना चाहता हूं, इसलिए जब मैं हब से क्लाइंट विधियों को कॉल करता हूं, तो मेरे पास उचित इंटेलिसेंस समर्थन और दृढ़ता से टाइप किए गए तर्क होंगे। हालांकि, मैं क्या संघर्ष करता हूं, यह है कि हब को यह कैसे पता चले कि मेरे क्लाइंट मॉडल की विधि वास्तव में ब्राउज़र में लागू की जा रही है।

यह मेरा TestModel वर्ग है:

public sealed class TestModel 
{ 
    public String Name { get; set; } 
    public void Notify() {} 
    public void NotifyComplex(TestModel model) {} 
} 
गैर सामान्य हब के साथ

, मैं सिर्फ dynamic ly this.Context.Clients.Client(…) या this.Context.Caller बाध्य पर .Notify() या .Notify(new TestModel() { Name = "sth" }) फोन चाहते हैं, लेकिन सामान्य वर्ग के साथ, मैं जब फोन इन खाली विधियों को इसी तरह से, ब्राउजर को बिल्कुल अधिसूचित नहीं किया जाता है।

जेनेरिक हब क्लास का उपयोग किस तरह किया जाना चाहिए?

+0

: http://stackoverflow.com/a/21763587/526704 – DLeh

+0

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

+0

मुझे यकीन नहीं था कि यह सहायक होगा या नहीं, लेकिन मैंने सोचा कि मैं जो मिला वह प्रदान करता हूं। क्षमा करें मेरे पास कोई अन्य उपयोगी अंतर्दृष्टि नहीं है :( – DLeh

उत्तर

8

मुझे जवाब मिला है। MSDN प्रलेखीकरण नहीं अप-टू-डेट अभी तक के रूप में है, लेकिन एएसपी नेट साइट अच्छा SignalR ट्यूटोरियल प्रदान करता है और उनमें से एक टाइप किया केन्द्रों को शामिल किया गया:

http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#stronglytypedhubs

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

public sealed class TestHub 
    : Hub<ITestClient> 
{ 
    public override Task OnConnected() 
    { 
    this.Clients.Caller.SayHello("Hello from OnConnected!"); 
    return base.OnConnected(); 
    } 

    public void Hi() 
    { 
    // Say hello back to the client when client greets the server. 
    this.Clients.Caller.SayHello("Well, hello there!"); 
    } 
} 

public interface ITestClient 
{ 
    void SayHello(String greeting); 
} 
+1

ध्यान रखें कि 'ऑनकनेक्टेड' विधि को कॉल करने के लिए, आपको एक पंजीकरण करने की आवश्यकता है क्लाइंट विधि पहले: '$ .connection.testHub.client.sayHello = फ़ंक्शन (जी) {...}'। यह डिज़ाइन द्वारा है, क्लाइंट, जिसे कॉल नहीं किया जा सकता है, 'ऑन [कनेक्टेड | रिकॉन्क्टेड | डिस्कनेक्ट]' विधियों को ट्रिगर नहीं करता है और अनुरोध-प्रतिक्रिया प्रतिमान के समान ही हब विधियों को ही बुला सकता है। –

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