2010-11-08 11 views
11

मैं निनजेक्ट के लिए नया हूं और मुझे कस्टम सदस्यता प्रदाता के साथ इसका उपयोग करने में समस्याएं आ रही हैं।सदस्यता के साथ निनजेक्ट का उपयोग करना। प्रदाता

मेरे सदस्यता प्रदाता में पारित भंडार इंटरफ़ेस है ऐसा लगता है कि:।

public class CustomMembershipProvider : MembershipProvider 
{ 
    public CustomMembershipProvider(IRepository repository) 
    { 
    } 
} 

मैं उपयोग कर रहा हूँ कोड thats एक प्रारंभिक बिंदु के रूप MVC अनुप्रयोग में खाता मॉडल का हिस्सा है।

हालांकि जब यह Membership.Provider पर कॉल करता है तो मुझे No parameterless constructor defined for this object कहने में त्रुटि मिलती है।

मैंने IRepository को Repository कक्षा में बांधने के लिए निंजेक्ट में बाइंडिंग सेट की है जो काम करता है क्योंकि मैंने इसे नियंत्रक में परीक्षण किया है।

Membership.Provider के लिए उपयोग करने के लिए निनजेक्ट में सही बाइंडिंग क्या हैं?

+0

उत्तरों की समीक्षा और सबसे अच्छा एक इनाम कृपया अगर आप – mare

उत्तर

9

इस तरह यह दोनों MVC और Ninject के नए संस्करण (संस्करण 3) के साथ आज किया जाना चाहिए है:

आप DependencyResolver उदाहरण के लिए उपयोग किया और Ninject वर्तमान DependencyResolver के रूप में सेट करता है। इस तरह आपको स्थिर निंजा कर्नेल तक पहुंच प्राप्त करने के लिए हैक्स की आवश्यकता नहीं है। कृपया ध्यान दें, मेरे उदाहरण सदस्यता के लिए मेरे अपने IUserService भंडार का उपयोग करता है ...

IUserService _userService = DependencyResolver.Current.GetService<IUserService>(); 
+0

में "इंजेक्ट" विधि को कॉल कर सकते हैं आप इसे एमवीसी के बजाय वेबफॉर्म में कैसे करते हैं? – Tom

+0

यह प्रत्यक्ष निंजा कर्नेल उपयोग से बेहतर समाधान है। – kaptan

+0

बहुत बहुत धन्यवाद! –

0

मैंने कभी भी निनजेक्ट का उपयोग नहीं किया है। लेकिन StructureMap में मैं इस निर्भरता सेट:

expression.For<MembershipProvider>().Add(System.Web.Security.Membership.Provider); 

और यह ठीक काम करता है।

+2

इस सवाल का जवाब नहीं है सकते हैं। वह प्रदाता उदाहरण बनाने के लिए कह रहा है, प्रदाता को किसी और चीज में इंजेक्ट करने का तरीका नहीं है। –

5

चूंकि सदस्यता संग्रह और Membership.Provider उदाहरण निनजेक्ट उन्हें तत्काल करने से पहले बनाया गया है, तो आपको ऑब्जेक्ट पर पोस्ट निर्माण सक्रियण करने की आवश्यकता है। यदि आप अपने प्रदाता वर्ग में अपनी संपत्तियों के लिए [Inject] के साथ अपनी निर्भरताओं को चिह्नित करते हैं, तो आप kernel.Inject(Membership.Provider) पर कॉल कर सकते हैं - यह आपकी संपत्तियों पर सभी निर्भरताओं को असाइन करेगा।

private IRepository _repository; 

[Inject] 
public IRepository Repository 
{ 
    get { return _repository; } 
    set { _repository= value; } 
} 

public CustomMembershipProvider() 
{ 
    NinjectHelper.Kernel.Inject(this); 
} 

कहाँ NinjectHelper से Kernal प्राप्त करने के लिए एक स्थिर सहायक वर्ग है:

+0

इस पर वापस आकर्षित करना यह है कि यह प्रदाता पर निनजा निर्भरता बनाता है। कोई बड़ा सौदा नहीं है, लेकिन यदि आपका प्रदाता पुस्तकालय का हिस्सा है, तो संभवतः कुछ बाहरी निर्भरताओं के रूप में संभव है, तो यह कोई मजेदार नहीं है। – crush

9

सबसे अच्छा समाधान मैंने पाया निम्नलिखित था।

+4

NinjectHelper क्या है? मुझे यह नहीं मिल रहा है। क्या मुझे इसे खुद से बनाने की ज़रूरत है? विशेषता का उपयोग करने के लिए – Tomas

+0

+1, लेकिन "सहायक" का उपयोग करने के लिए नहीं। आप यहाँ सेवा लोकेटर antipattern कर रहे हैं (तरह)। आप WebActivator.PostApplicationStartMethod –