2010-06-09 18 views
5

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

उत्तर

16

जब आप का उपयोग svcutil.exe या विजुअल स्टूडियो, कई प्रकार के स्वत: जनरेट एक ग्राहक इंटरफ़ेस हो जाएगा में से एक में सेवा संदर्भ जादूगर जोड़ें। आइए इसे IMyService पर कॉल करें। भी स्वत: जेनरेट किए गए इंटरफ़ेस को IMyServiceChannel जैसे कुछ कहा जाएगा जो IMyService और IDisposable लागू करता है। अपने शेष ग्राहक एप्लिकेशन में इस अमूर्तता का प्रयोग करें।

जब से तुम एक नया चैनल बनाने और इसे फिर से बंद करने के लिए सक्षम होना चाहते हैं, तो आप लागू कर सकते हैं एक सार फैक्टरी:

public interface IMyServiceFactory 
{ 
    IMyServiceChannel CreateChannel(); 
} 

अपने क्लाइंट अनुप्रयोग के बाकी में, आप IMyServiceFactory पर निर्भरता ले जा सकते हैं:

:

public class MyClient 
{ 
    private readonly IMyServiceFactory factory; 

    public MyClient(IMyServiceFactory factory) 
    { 
     if (factory == null) 
     { 
      throw new ArgumentNullException("factory"); 
     } 

     this.factory = factory; 
    } 

    // Use the WCF proxy 
    public string Foo(string bar) 
    { 
     using(var proxy = this.factory.CreateChannel()) 
     { 
      return proxy.Foo(bar); 
     } 
    } 
} 

आपको लगता है कि WCF के ChannelFactory<T> एक कार्यान्वयन के रूप में लपेटता IMyServiceFactory का एक ठोस कार्यान्वयन बना सकते हैं

अब आप MyServiceFactory में IMyServiceFactory को मैप करके अपने DI कंटेनर को कॉन्फ़िगर कर सकते हैं। यह इस प्रकार से महल विंडसर में किया है:

container.Register(Component 
    .For<IMyServiceFactory>() 
    .ImplementedBy<MyServiceFactory>()); 

बोनस की जानकारी: यहाँ how to wire up a WCF service with a DI Container है।

आप एक अंतरफलक है कि WCF से संबंधित नहीं है है:

+1

ठीक है, लेकिन मैं कक्षा में एक कस्टम कार्यान्वयन सेवा में इंजेक्ट करने के लिए कैसे करता हूं? उदाहरण: सार्वजनिक इंटरफ़ेस ISendMail {seng (स्ट्रिंग विषय, स्ट्रिंग संदेश, स्ट्रिंग); }। मैं प्रत्येक क्लाइंट के लिए अलग-अलग वर्ग को लागू करना चाहता हूं और क्लाइंट में मैं डब्ल्यूसीएफ सेवा में इस कार्यान्वयन को इंजेक्ट करता हूं। टीक्स –

+0

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

+2

आप उस शब्द का उपयोग करते रहेंगे। मुझे नहीं लगता कि इसका मतलब है कि इसका मतलब क्या है। –

1

यहाँ मैं अपने प्रश्न से समझते हैं। आइए इसे कॉल करें IInterface

आपके पास एक डब्ल्यूसीएफ क्लाइंट है जो एक सेवा का उपयोग करता है। आइए सेवा अनुबंध पर कॉल करें: IService

आप सर्विस क्लाइंट क्लास चाहते हैं जो डिफ़ॉल्ट रूप से IService लागू करता है जब आप IInterface को लागू करने के लिए सेवा संदर्भ भी जोड़ते हैं।

यदि यह मामला है, तो आप इस तथ्य का उपयोग कर सकते हैं कि सेवा क्लाइंट क्लास को आंशिक रूप से चिह्नित किया गया है।

बस सेवा क्लाइंट के लिए एक और आंशिक घोषणा करें और आपको आवश्यक इंटरफ़ेस जोड़ें (आपको यह सुनिश्चित करना होगा कि नामस्थान ऑटो-जेनरेट कोड और आपके कोड के बराबर हैं)। इसे कुछ दिखना चाहिए:

namespace [ServiceClient Namespace] 
{ 
    public partial class ServiceClient : IInterface 
    { 
    } 
} 

आशा है कि इससे मदद मिलेगी।

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