2009-07-24 9 views
10

WCF services के लिए निर्भरता इंजेक्शन के प्रयोग पर अप के बाद में एक वस्तु सुई, वहाँ प्रमाणकों WCF के लिए डि का उपयोग कर के किसी भी तरह से है, इसलिए है कि एक ऐसा कर सकता है:कैसे एक WCF सत्यापनकर्ता वर्ग

public class DIValidator : UserNamePasswordValidator 
{ 
    private readonly IService service; 

    [Inject] 
    public DIValidator(IService service) 
    { 
     this.service = service; 
    } 

    public override void Validate(string userName, string password) 
    { 
     service.Login(userName, password); 
    } 
} 

संपादित करें - मैंने अपने कस्टम व्यवहार एक्सटेंशन को Dzmitry की सलाह लागू करने का प्रयास किया, क्योंकि मेरे सत्यापनकर्ता को app.config में परिभाषित किया गया है। दुर्भाग्य से मैं एक MethodMissingException, क्योंकि WCF एक डिफ़ॉल्ट निर्माता के लिए मेरी सत्यापनकर्ता चाहता है मिलती है:

public class DependencyInjectionServiceBehavior : BehaviorExtensionElement, IServiceBehavior 
    { 
     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      serviceHostBase.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = DISupport.Kernel.Get<IService>(); 
     } 
    } 
+0

"डब्ल्यूसीएफ वैलिडेटर" क्या है? –

+0

मुझे नहीं पता कि इसे और क्या कहना है। यदि आप चाहते हैं कि मैं इस मामले में "wcf validator" विशिष्ट हो, तो UserNamePasswordValidator का एक कस्टम कार्यान्वयन होगा। –

+0

जॉन। तुम इतनी गन्दा क्यों हो? अगर मैं 56,000 से अधिक प्रतिनिधि अंक प्राप्त करता हूं, तो मैं भी ऐसा ही हो सकता हूं, लेकिन आप तरह से संवेदना के रूप में आते हैं। ये राय न केवल इस पोस्ट से हैं, बल्कि अन्य प्रतिक्रियाओं और धागे से आप इसमें शामिल हैं, कुछ मामलों में, आप क्रूर और माध्य से बाहर आते हैं। – SideFX

उत्तर

1

मैं जानता हूँ कि यह नहीं है:

System.MissingMethodException: No default constructor has been defined for this object.

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, BooleannoCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)

यहाँ मेरी व्यवहार वर्ग है जिस समाधान को आप ढूंढ रहे हैं, लेकिन मैं एक डिफ़ॉल्ट कन्स्ट्रक्टर तैयार करूंगा जो आपके आईओसी कंटेनर (डीआई के बजाय सेवा लोकेटर) से आईएसईसी प्राप्त करेगा। ऐसा करने का सबसे अच्छा तरीका नहीं है, लेकिन सबसे सरल मैं सोच सकता हूं।

संपादित करें: निश्चित रूप से आप उस निर्माता को छोड़ सकते हैं जो आपको निर्भरता को इंजेक्ट करने की अनुमति देता है, अगर आपको परीक्षण या किसी अन्य purpouse के लिए IService को नकल करने की आवश्यकता है।

+0

जब कोई अन्य विकल्प उपलब्ध नहीं होता है तो मैं ऐसा करता हूं - नियमित कन्स्ट्रक्टर छोड़ें, और दूसरा पैरामीटर रहित कन्स्ट्रक्टर प्रदान करें जो सर्विसलोकेटर के तर्कों का उपयोग करके मूल को कॉल करता है – AlexFoxGill

3

सामान्य कस्टम सत्यापनकर्ता को प्रोग्रामेटिक रूप से असाइन किया गया है (कॉन्फ़िगरेशन फ़ाइल से ऐसा करने की भी संभावना है) ऐसा कुछ और सेवा होस्ट खोले जाने से ठीक पहले किया जाता है और मूल रूप से यह भी समय है जब आप अपना डी कंटेनर उदाहरण बनाते हैं आगे उदाहरण प्रदाता के माध्यम से सेवा उदाहरणों के लिए किया जाएगा:

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new LocalUserNamePasswordValidator(); 

आप के साथ ही अच्छी तरह से अपने कस्टम सत्यापनकर्ता बनाने के लिए डि कंटेनर का उपयोग कर सकते हैं।

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>(); 
+0

कूल, क्या एप.कॉन्फिग में वैधकर्ता प्रकार को असाइन करने का कोई तरीका है और IServiceBehaviour उदाहरण से सत्यापनकर्ता प्रकार को तुरंत चालू करना? मैंने अपने कस्टम व्यवहार वर्ग से CustomUserNamePasswordValidator को सेट करने का प्रयास किया लेकिन जब मैं अपनी डब्ल्यूसीएफ सेवा शुरू करता हूं तो मुझे रनटाइम अपवाद मिलता है। –

+0

क्या आप मुझे कोड नमूना और अपवाद विवरण दे सकते हैं और मैं आपकी मदद करने की कोशिश करूंगा। –

+0

ठीक है अब मैंने अपना प्रश्न संपादित कर लिया है। –