2010-01-12 7 views
11

का उपयोग करते हुए डब्ल्यूएएस में होस्ट की गई डब्ल्यूसीएफ सेवा के साथ एन इंजेक्ट का उपयोग करते समय मेरे पास एमएसएमक्यू बाइंडिंग का उपयोग कर डब्ल्यूसीएफ सेवा है जो आईआईएस 7.0 में विंडोज सक्रियण सेवा का उपयोग कर सक्रिय है।एचटीपी कोंटेक्स्ट के लिए वैकल्पिक जब एमएसएमक्यू बाध्यकारी

मैं एन इंजेक्ट पर एक बड़ा प्रशंसक हूं इसलिए मैं डब्ल्यूसीएफ के लिए एन इंजेक्शन एक्सटेंशन का उपयोग कर रहा हूं, जो एक सामान्य HTTP डब्ल्यूसीएफ सेवा के लिए बहुत अच्छा काम करेगा।

हालांकि, WAS सक्रिय सेवाओं में कोई HTTP पाइपलाइन नहीं है, इसलिए मैं अपने प्रकार को बाध्य करते समय InRequestScope का उपयोग नहीं कर सकता क्योंकि System.Web.HttpContext.Current शून्य है। मैं डब्ल्यूएएस का उपयोग करते समय एक विकल्प खोजने के लिए संघर्ष कर रहा हूं जो मुझे वह चाहिए जो मुझे चाहिए। AspCompatibility मोड विशेषता इस मोड में या तो काम नहीं करती है।

मैं सोचा InThreadScope काम हो सकता है, लेकिन सेवा क्या उस में निष्पादित किया जाता है की तुलना में एक अलग थ्रेड में बनाया जाता है।

तो बुनियादी तौर पर मैं WCF के लिए HttpContext के बराबर की जरूरत है + गुंजाइश के लिए गया था मेरी वस्तुओं अनुरोध स्तर क्या इस दुनिया में कुछ स्थिर वस्तु है जो वैसे ही काम करेगी या किसी और के पास किसी चीज़ पर कोई विचार है जो मैं एक साथ हैक कर सकता हूं?

उत्तर

9

देख रहे हैं मैं Ninject 2.0 के लिए अपने खुद के WCF एक्सटेंशन लागू किया इससे पहले कि मैं जानता था कि वहाँ GitHub पर एक this अप किया गया है हूँ। मेरे कार्यान्वयन अलग है थोड़ा है, लेकिन मैं देखते हुए वस्तुओं के लिए एक समाधान के साथ आया था:

Bind<IHelloWorldService>() 
     .To<HelloWorldService>() 
     .InScope(NinjectWcfScopeCallbacks.WcfWebContext); 

WCF की मेजबानी नहीं की है:

using System; 
using Ninject.Activation; 

namespace Ninject.Contrib.Wcf { 
    /// <summary> 
    /// Defines Scope Callbacks for WCF Context. 
    /// </summary> 
    public class NinjectWcfScopeCallbacks { 
    /// <summary> 
    /// Defines WCF Context scope. 
    /// </summary> 
    public static readonly Func<IContext, object> WcfContext = 
     ctx => (System.ServiceModel.OperationContext.Current != null 
       ? System.ServiceModel.OperationContext.Current. 
        InstanceContext. 
        Extensions.Find<NinjectInstanceContext>() 
       : null); 

    /// <summary> 
    /// Defines WCF Web Context scope. 
    /// </summary> 
    public static readonly Func<IContext, object> WcfWebContext = 
       ctx => System.ServiceModel.Web.WebOperationContext.Current; 
    } 
} 

पूर्णता के लिए, यह मैं कैसे कॉलबैक ऊपर परिभाषित का उपयोग करें WAS में सेवाएं, इसलिए सुनिश्चित नहीं है कि आप उपरोक्त परिभाषित WcfWebContext या WcfContext का उपयोग करेंगे, लेकिन आप 'बाहर निकलने और देखने का प्रयास कर सकते हैं। यदि WebOperationContext काम करता है, तो आप सब तैयार हैं। अन्यथा, मैंने पाया कि चीजें थोड़ा और जटिल हैं। आप ऊपर दिए गए कोड स्निपेट को OperationContext से जुड़े NinjectInstanceContext कक्षा का उपयोग करेंगे। यह एक वर्ग है जिसे मैंने लिखा है जो निनजेक्ट 2.0 के "कैश एंड कलेक्ट" तंत्र का उपयोग करता है जो वस्तुओं को निर्धारित रूप से निपटाने की अनुमति देता है। असल में, कक्षा IExtension<InstanceContext> लागू करती है जो लगभग OperationContext पर लगभग कुछ भी जोड़ने के लिए डब्ल्यूसीएफ निर्माण है। यह वर्ग निनजेक्ट के INotifyWhenDisposed इंटरफेस को भी कार्यान्वित करता है जो निर्धारिती निपटान के लिए समर्थन प्रदान करता है।

/// <summary> 
    /// Defines a custom WCF InstanceContext extension that resolves service instances 
    /// using Ninject. 
    /// <remarks> 
    /// The custom InstanceContext extension provides support for deterministic disposal 
    /// of injected dependencies and service instances themselves by being hook into 
    /// Ninject's "cache and collect" mechanism (new in Ninject 2.0) for object life cycle 
    /// management. This allows binding object instances to the lifetime of a WCF context 
    /// and having them deterministically deactivated and disposed. 
    /// </remarks> 
    /// </summary> 
    public class NinjectInstanceContext : 
       IExtension<InstanceContext>, INotifyWhenDisposed { 
    } 

Ninject के लिए मेरे WCF विस्तार के बाकी GitHub पर one रूप में ही है: यहाँ क्या वर्ग परिभाषा लग रहा है की तरह है। मूल रूप से ऐसा होता है कि एक उदाहरण प्रदाता बनाया जाता है जो डब्ल्यूसीएफ "सक्रियण" श्रृंखला में प्लग किया जाता है - मैं अपनी विशिष्ट शब्दावली का उपयोग नहीं कर रहा हूं, बस मैं चीजों को कैसे समझता हूं। तो, विचार यह है कि आपका इंस्टेंस प्रदाता डब्ल्यूसीएफ सेवा वर्ग के अनुरोधों के उदाहरणों को आपूर्ति करना चाहता है। तो, यहां हम सेवा उदाहरण का उत्पादन करने के लिए निनजेक्ट का उपयोग करते हैं। ऐसा करके, हम किसी भी निर्भरता को सक्रिय और इंजेक्ट भी कर सकते हैं। मेरे कार्यान्वयन में इंस्टेंस प्रदाता क्या करता है यदि NinjectInstanceContext पर उदाहरण के लिए निनजेक कर्नेल को लपेटता है और इसे OperationContext से संलग्न करता है। सेवा के निर्माण को तब इस डब्ल्यूसीएफ एक्सटेंशन में सौंप दिया जाता है। जब इंस्टेंस प्रदाता को एक सेवा जारी करने के लिए कहा जाता है, तो NinjectInstanceContext जो ऑपरेशन कॉन्टेक्स्ट से जुड़ा हुआ था, का निपटारा किया जाता है जो INotifyWhenDisposed को लागू करने के तरीके से सेवा (और संभावित रूप से इसकी निर्भरता) के निर्धारिक निपटान का कारण बनता है।

आशा है कि यह चर्चा मदद करेगी।मैं अगर मैं कुछ और ठोस कोड यहां पोस्ट अगर आप रुचि रखते हैं प्राप्त कर सकते हैं देखेंगे।

+1

टूटी लिंक। क्या ये सही है? https://github.com/ninject/ninject.extensions.wcf –

+0

आप सही हैं - मैं लिंक ठीक कर दिया। –

0

मुझे यकीन है कि OperationContext क्या आप के लिए