5

मैं SignalR 2.0 के साथ एक मौजूदा आईओसी उपयोग कर सकते हैं कैसे?SignalR में एक मौजूदा आईओसी कंटेनर का उपयोग करते हुए 2.0

ट्यूटोरियल से ऐसा प्रतीत होता मैं सेटअप करने के लिए एक विशेषता के माध्यम से एक वर्ग Owin से कहा जा करने की जरूरत है:

using Microsoft.Owin; 
using Owin; 
[assembly: OwinStartup(typeof(SignalRChat.Startup))] 
namespace SignalRChat 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app /*HOW AM I GONNA GET UNITY CONTAINER HERE?*/) 
     { 
      var hubConfig = new HubConfiguration() 
      { 
       EnableJSONP = true, 
       EnableDetailedErrors = true, 
       EnableJavaScriptProxies = true, 
       Resolver = new SignalRUnityDependencyResolver(container) 
      }; 


      // Any connection or hub wire up and configuration should go here 
      app.MapSignalR(hubConfig); 
     } 
    } 
} 

समस्या यहाँ है कि मैं पहले से ही एक कंटेनर है, कि बूट तंगी है और सिंगलटन देखते हैं कंटेनर में ऐसे उदाहरण जिन्हें एक ही मेजबान के तहत साझा एमवीसी ऐप के साथ साझा करने की आवश्यकता है।

हालांकि यहां की समस्या यह है कि पहले के विपरीत, ऐसा नहीं लगता है कि मैं अपने कोड से MapSignalR विधि को कॉल कर सकता हूं। इसके बजाय मुझे यह करने के लिए ओविन पर भरोसा करना है। हालांकि ओविन को कंटेनर से अवगत नहीं है जिसे मैंने पहले ही सेटअप किया है।

इस को हल करने के लिए सबसे अच्छा तरीका क्या है? मेरे पास कुछ बहुत ही कच्चे विचार हैं कि इनमें से कुछ को पकड़ने के लिए स्थैतिक चर का उपयोग करके समाधान को कैसे हैक करना है - लेकिन मुझे इसके बारे में बहुत नफरत है। कोड भंगुर होगा और ऑपरेशन का क्रम आसानी से एक सूक्ष्म बग पेश कर सकता है।

वहाँ एक रास्ता Owin होने उपरोक्त विधि आह्वान बिना IAppBuilder उदाहरण पर भी नियंत्रण प्राप्त करने के लिए है? सिग्नलआर प्रारंभ होने पर मैं बेहतर तरीके से नियंत्रण कर सकता हूं और मैं कॉन्फ़िगरेशन में अपना आईओसी पास कर सकता हूं।

+0

कि अजीब बात है। सिग्नलआर 2.0 से पहले, एएसपी.नेट ने आपके लिए ग्लोबल.एक्सएक्स कहा और आप वहां पंजीकृत मार्ग हैं। यह काफी वही बात है। – davidfowl

उत्तर

7

मेरे मामले में मैंने एक कस्टम हब एक्टिवेटर बनाया है जो मेरे ऐप और सिग्नलआर (कन्स्ट्रक्टर इंजेक्शन द्वारा) के बीच साझा कंटेनर का उपयोग करता है, इस तरह आपके पास पूरे एप्लिकेशन के लिए एकल समग्र रूट होगा।

public class CustomHubActivator : IHubActivator 
    { 
     private readonly Container _container; 

     public MseHubActivator(Container container) 
     { 
      _container = container; 
     } 

     public IHub Create(HubDescriptor descriptor) 
     { 
      return _container.GetInstance(descriptor.HubType) as IHub; 
     } 
    } 

अपने कस्टम हब उत्प्रेरक रजिस्टर जब you're करने के बजाय अपने अनुप्रयोग (शायद Global.asax)

GlobalHost.DependencyResolver.Register(typeof (IHubActivator), 
                () => new CustomHubActivator(Container)); 

यही बहुत सरल समाधान bootstrapping:

निम्न प्रयास करें फिर से कॉन्फ़िगर signalR dependencyResolver

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