देख रहे हैं मैं 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
को लागू करने के तरीके से सेवा (और संभावित रूप से इसकी निर्भरता) के निर्धारिक निपटान का कारण बनता है।
आशा है कि यह चर्चा मदद करेगी।मैं अगर मैं कुछ और ठोस कोड यहां पोस्ट अगर आप रुचि रखते हैं प्राप्त कर सकते हैं देखेंगे।
स्रोत
2010-01-12 15:18:21
टूटी लिंक। क्या ये सही है? https://github.com/ninject/ninject.extensions.wcf –
आप सही हैं - मैं लिंक ठीक कर दिया। –