2011-04-08 21 views
18

मैं MVC 3. में Ninject के साथ एक कस्टम सदस्यता प्रदाता के लिए भंडार सुईइंजेक्षन Ninject

MembershipProvider में मैं कोशिश की है निम्नलिखित कोशिश कर रहा हूँ के साथ कस्टम सदस्यता प्रदाता के लिए भंडार

:

[Inject] 
public TUMembershipProvider(ICustomerRepository customerRepository) 
{ 
    _customerRepository = customerRepository; 
} 

मेरी Ninject मॉड्यूल में मैं निम्नलिखित की कोशिश की

उपर्युक्त कार्यों में से कोई भी नहीं।

जब मैं

kernel.Inject(Membership.Provider); 

एक साथ (global.asa में) का उपयोग

[Inject] 
public ICustomerRepository _customerRepository{ get; set; } 

यह काम करता है, लेकिन मैं कोई जीवन चक्र प्रबंधन है और यह एक "ISession खुला है" त्रुटि का कारण होगा साथ NHibernate से, क्योंकि ISession InRequestScope है और भंडार नहीं है।

+0

मैं महीनों के लिए इस बात पर अटक गया है। –

उत्तर

1

समस्या यह है कि संपूर्ण सदस्यता आधारभूत संरचना एक "मूल" .NET कोड (System.Web.Security) है जो एमवीसी और एमवीसी द्वारा उपयोग किए जाने वाले डी कंटेनर के बारे में नहीं जानता है। सदस्यता के लिए स्थैतिक कॉल। प्रदाता कॉन्फ़िगरेशन के आधार पर सदस्यता प्रदाता को लौटाता है, हालांकि, निर्दिष्ट प्रदाता प्रकार को एक साधारण एक्टिवेटर के साथ तत्काल किया जाता है। क्रिएटइन्सेंस कॉल। इसलिए, निर्भरता इंजेक्शन के परिणामस्वरूप आपकी रिपोजिटरी निर्भरता को लात मारने और सेट करने का कोई मौका नहीं है। यदि आप स्पष्ट रूप से निलंबित किए गए इंस्टेंस को निनजेक्ट के साथ सेट अप करते हैं तो यह काम कर सकता है, क्योंकि आपने स्पष्ट रूप से निर्भरताओं को सेट करने के लिए ऑब्जेक्ट को निजेक्ट दिया है। यहां तक ​​कि इस मामले में यह केवल संपत्ति इंजेक्शन के साथ काम कर सकता है न कि कन्स्ट्रक्टर इंजेक्शन के साथ, क्योंकि उदाहरण पहले सदस्यता कॉन्फ़िगरेशन द्वारा बनाया गया था।

संक्षेप में: आप सदस्यता प्रदाता में निर्भरता को आसानी से इंजेक्ट नहीं कर सकते क्योंकि यह एक निर्भरता इंजेक्शन कंटेनर से हल नहीं होता है। मुझे लगता है कि आप 2 संभावनाएं हैं:

  1. आप सीधे कस्टम सदस्यता प्रदाता में भंडार बना सकते हैं या आप मांग पर कुछ अन्य साधनों (जहां वेब संदर्भ पहले से मौजूद है) तक पहुँच।
  2. आप एक स्तर ऊपर जाते हैं और उन घटकों की जांच करते हैं जो आपके सदस्यता प्रदाता का उपयोग करेंगे और आप वहां परिवर्तन करने की कोशिश करें (एक प्रारंभिक मेमर्सशिप के बजाय आपके डी कंटेनर से हल किए गए सदस्यता प्रदाता का उपयोग करने के लिए। प्रदाता)। इस "उच्च घटक" रूपों प्रमाणीकरण है, तो इस अनुच्छेद (IFormsAuthentication और IMembershipService साथ निर्भरता इंजेक्शन का प्रयोग करके) मदद की हो सकती है: http://weblogs.asp.net/shijuvarghese/archive/2009/03/12/applying-dependency-injection-in-asp-net-mvc-nerddinner-com-application.aspx
+0

मैं सोच रहा था कि मुझे एमवीसी लाइब्रेरी में खुद को IMembershipService इंटरफ़ेस क्यों नहीं मिल रहा है: आपको यहां वर्णित विज़ुअल स्टूडियो टेम्पलेट द्वारा जेनरेट किया जाएगा http://stackoverflow.com/questions/2349022/how-do-i-get- –

0

क्या आप अपने भंडार "मैन्युअल" समाधान करने का प्रयास है, इस सवाल का जवाब में की तरह: Ninject : Resolving an object by type _and_ registration name/identifier ?

+0

से एक-एएसपी-एटी-एएसपी-नेट-एमवीसी-एप्लिकेशन-सदस्यताप्रोवाइडर- लेकिन मुझे अभी भी कर्नेल इंस्टेंस को किसी भी तरह से प्राप्त करने की आवश्यकता है? – Luticka

+0

यदि आप अपने भंडारण को आपके मॉड्यूल के कार्यान्वयन में पंजीकृत करते हैं (यानी।MyModule: IModule), फिर एक कर्नेल उदाहरण प्राप्त करने के लिए आपको 'IKernel कर्नेल = नया मानक कर्नेल (नया MyModule()) कॉल करने की आवश्यकता है; ' देखें http://ninject.codeplex.com/wikipage?title=Modules%20and% 20the% 20Kernel –

5

आप दृष्टिकोण @Remo Gloor outlines in his blog post on provider injection का उपयोग कर सकते हैं।- एक बहुत ही सरल वर्ग जिसका केवल समारोह है संपत्ति इंजेक्शन और आगे के लिए एक receptable होने के लिए बनाने

  1. (हालांकि पैटर्न वह दिखाता है कि आपके प्रदाता पर कोई भी ऐसे गुण इंजेक्शन की जरूरत के लिए [Inject] रों जोड़ें: यह 3 चरण शामिल हैं एक असली वर्ग के लिए किसी भी अनुरोध निर्माता इंजेक्शन का उपयोग कर कार्यान्वित - अच्छी तरह से लायक निम्नलिखित)

    public class MyMembershipProvider : SqlMembershipProvider 
    { 
        [Inject] 
        public SpecialUserProvider SpecialUserProvider { get;set;} 
        ... 
    
  2. एक प्रारंभकर्ता आवरण कि IHttpModule जिसमें प्रदाता खींचती लागू करता है, इसके निर्माण के ट्रिगर बनाएं है: -

    01,235,
    public class ProviderInitializationHttpModule : IHttpModule 
    { 
        public ProviderInitializationHttpModule(MembershipProvider membershipProvider) 
        { 
        } 
    ... 
    
  3. अपने RegisterServices में रजिस्टर IHttpModule: -

    kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>(); 
    
  4. कोई 4 होता है; निनजेक्ट बाकी करता है - स्टार्टअप अनुक्रम के दौरान सभी पंजीकृत IHttpModules को बूटस्ट्रैपिंग सहित)।


अंत में, आप कुछ प्रत्यक्ष पूरी तरह से braindead यह बड़े करीने से हल करती है कि के लिए देख रहे हैं (जीवन काल आदि फिर से ब्लॉग पोस्ट पर टिप्पणी पढ़ने के लिए मत भूलना), कोशिश पूरे गंदगी पर this @Remo Gloor answer instead


पी एस के लिए एक महान writeup Provider is not a Pattern by @Mark Seemann है। (और उनके उत्कृष्ट पुस्तक के लिए oboligatory प्लग: - Dependency injection in .NET जो आप पहले सिद्धांतों से बाहर आराम से इस सामग्री लगाना होगा)

2

मैं इस समस्या थी

एक कस्टम सदस्यता, भूमिका और MVC से एक अन्य परियोजना में प्रोफ़ाइल प्रदाता भंडार का उपयोग करते हुए, जब भी मैं प्रदाता को इंजेक्शन रिपोजिटरी कॉल करता हूं तो शून्य था।

कर्नेल को कॉल करने का प्रयास किया। इंजेक्ट (सदस्यता। प्रदाता); NinjectWebCommon विधि रजिस्टर सर्विसेज (I कर्नेल कर्नेल) में अपवाद मिला

परिणाम हमेशा शून्य है, क्योंकि asp.net की सदस्यता के लिए यह अपनी स्थिर संपत्ति है। सदस्यता है। प्रोविडर। और यह उदाहरण उदाहरण निंजा प्रबंधन का हिस्सा नहीं है।

तो PostApplicationStartMethod

पर उपयोग यहाँ cipto द्वारा soloution NinjectWebCommon को attrbute और विधि जोड़ने है:

[assembly: WebActivator.PreApplicationStartMethod(typeof(WebApp.App_Start.NinjectWebCommon), "Start")] 
    [assembly: WebActivator.PostApplicationStartMethod(typeof(WebApp.App_Start.NinjectWebCommon), "RegisterMembership")] 
    [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(WebApp.App_Start.NinjectWebCommon), "Stop")] 

    public static void RegisterMembership() 
    { 
     bootstrapper.Kernel.Inject(Membership.Provider); 
    } 
संबंधित मुद्दे