दिलचस्प पोस्ट
SLComposeViewController साझा करने के लिए ट्यूटोरियल VBScript – त्रुटि हैंडलिंग का उपयोग करना एंड्रॉइड फेसबुक की हैश कैसे बनाऊँ? डोम समाप्त होने के बाद मैं एक निर्देश कैसे चला सकता हूं? MySQL वाइल्ड कार्ड से बचें कैनवास में माउस स्थान प्राप्त करना सीतनिद्रा में होना: कहाँ सम्मिलित करें = गलत, अद्यतन करने योग्य = गलत विदेशी कुंजी सम्मिलित समग्र कुंजी नक्षत्रों में हैं? विधि में हस्ताक्षर होना चाहिए "स्ट्रिंग विधि () … …" लेकिन हस्ताक्षर "शून्य विधि ()" है डीबी 2 कॉमा से आउटपुट आउटपुट फाइनल और प्रभावी रूप से अंतिम के बीच अंतर यूनिकोड अनुपूरक बहुभाषी विमान प्रतीकों के साथ वेबफॉन्ट बनाएं Laravel 5 में सभी दृश्यों को डेटा कैसे प्राप्त करें? Jquery का उपयोग कर एक अभिभावक तत्व से पाठ (आंतरिक तत्वों को निकाले बिना) कैसे निकालना है एंड्रॉइड में कस्टम फ़ॉन्ट को थीम में जोड़ना जावास्क्रिप्ट के लिए अंडरस्कोर के साथ डुप्लिकेट ऑब्जेक्ट्स को निकालना

एक WCF सेवा के लिए डेटा इंजेक्शन

मेरे पास WCF सेवाओं की रचना है जैसे कि मिगुएल कास्त्रो ने सुझाव दिया था इसका मतलब है कि मैंने स्वयं को सब कुछ सेट किया है, और सेवाओस्ट ऑब्जेक्ट्स का उपयोग करके मेरी सेवाएं होस्ट करने के लिए कन्सोल एप्लीकेशन है I

मैं अपनी सेवा वर्गों को पतला रखना चाहता हूं, और वे वर्तमान में बस व्यवहार वर्गों के लिए कॉल कर रहे हैं। मेरी समस्या अब इकाई परीक्षण कक्षाओं का परीक्षण है मैं एक कंस्ट्रक्टर पैरामीटर के रूप में कक्षाओं में कुछ को इंजेक्शन करना चाहता हूं जैसे कि मैं इसे दूर कर सकता हूं और उचित पृथक इकाई परीक्षण लिख सकता हूं। सर्विसहोस्ट क्लास कोई तर्क स्वीकार नहीं करता है, इसलिए मेरा प्रश्न यह है कि मैं सेवा कक्षाओं में डेटा इंजेक्ट कैसे कर सकता हूं – या क्या मैं नहीं कर सकता?

वेब के समाधान से एकत्रित समाधान "एक WCF सेवा के लिए डेटा इंजेक्शन"

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

एक उदाहरण के रूप में, मैंने हाल ही में एक लिखा है जो सेवा कार्यान्वयन के लिए निर्भरता को तार करने के लिए कैसल विंडसर का उपयोग करता है CreateServiceHost का कार्यान्वयन केवल यह करता है:

return new WindsorServiceHost(this.container, serviceType, baseAddresses); 

जहां यह this.container एक कॉन्फ़िगर IWindsorContainer है

WindsorServiceHost इस तरह दिखता है:

 public class WindsorServiceHost : ServiceHost { public WindsorServiceHost(IWindsorContainer container, Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { if (container == null) { throw new ArgumentNullException("container"); } foreach (var cd in this.ImplementedContracts.Values) { cd.Behaviors.Add(new WindsorInstanceProvider(container)); } } } 

और WindsorInstanceProvider इस तरह दिखता है:

 public class WindsorInstanceProvider : IInstanceProvider, IContractBehavior { private readonly IWindsorContainer container; public WindsorInstanceProvider(IWindsorContainer container) { if (container == null) { throw new ArgumentNullException("container"); } this.container = container; } #region IInstanceProvider Members public object GetInstance(InstanceContext instanceContext, Message message) { return this.GetInstance(instanceContext); } public object GetInstance(InstanceContext instanceContext) { var serviceType = instanceContext.Host.Description.ServiceType; return this.container.Resolve(serviceType); } public void ReleaseInstance(InstanceContext instanceContext, object instance) { this.container.Release(instance); } #endregion #region IContractBehavior Members public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) { dispatchRuntime.InstanceProvider = this; } public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) { } #endregion } 

यह बहुत पसंद हो सकता है, लेकिन ध्यान दें कि यह पुन: प्रयोज्य, सामान्य प्रयोजन वाला कोड है जो कि कम चक्रीय जटिलता है

आप अन्य डि कंटेनर के साथ निर्भरता इंजेक्शन को लागू करने के लिए या खराब मैन की DI का उपयोग करके एक ही कोडिंग मुहावरे का पालन कर सकते हैं।

यहां इस मुहावरे का एक पुराना लिप्युट है जो खराब मैन की DI का उपयोग करता है।

यदि आप कैसल विंडसर का उपयोग कर रहे थे, तो इसकी एक बड़ी डब्लूसीएफ एकीकरण सुविधा है जो आपको यह करने देती है, और बहुत आसानी से बहुत ज्यादा।

क्या आपने सिंगलटन के रूप में अपनी सेवा को कॉन्फ़िगर किया? मुझे पता चला कि सेवा उदाहरण बनाने के लिए डि कंटेनर का उपयोग करते समय IInstanceProvider कार्यान्वयन समस्याग्रस्त हो सकता है।

WCF सेवा के रूप में एक नकली होस्टिंग लेख में एक स्थिर विधि है, जो किसी एकल समापन बिंदु के साथ विधि में उत्कीर्ण वस्तु के आधार पर एक WCF सेवा होस्ट उत्पन्न करेगी।

इकाई परीक्षण वेब सेवाओं के लिए अनुशंसित पैटर्न के लिए उत्तर में विधि भी पोस्ट की गई थी।

NSubstitute उपयोग कॉल का उदाहरण है, लेकिन अन्य मजाकिया freameworks इस्तेमाल किया जा सकता है।