2011-06-29 12 views
8

में एक कस्टम रोल प्रदाता के साथ निनजेक्ट का उपयोग करना मैं एक एमवीसी 3 ऐप में कस्टम रोल प्रदाता का उपयोग करने की कोशिश कर रहा हूं। मुझे निजता का उपयोग कर सदस्यता प्रदाता ठीक से काम कर रहा है लेकिन भूमिका प्रदाता काम नहीं कर रहा है। सदस्यता प्रदाता को पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता नहीं होती है लेकिन भूमिका प्रदाता करता है। यहाँ कुछ कोड के टुकड़े है:एक एमवीसी 3 ऐप

Web.config

<membership> 
    <providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="MyApp.Models.NHibernateMembershipProvider" 
     applicationName="myApp" /> 
    </providers> 
</membership> 

<roleManager enabled="true"> 
    <providers> 
    <add name="MyRolesProvider" type="MyApp.Models.NHibernateRoleProvider" 
     applicationName="myApp" /> 
    </providers> 
</roleManager> 

मैं एक Ninject मॉड्यूल है।

public class MyNinjectModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<ISession>().ToMethod(
      x => MyApp.MvcApplication.SessionFactoryData.GetCurrentSession()); 

     // Respository 
     this.Bind<IUserRepository>().To<UserRepository>(); 
     this.Bind<MembershipProvider>().To<NHibernateMembershipProvider>(); 
     this.Bind<RoleProvider>().To<NHibernateRoleProvider>(); 
    } 
} 

कस्टम सदस्यता प्रदाता

public class NHibernateMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repo; 

    public NHibernateMembershipProvider(IUserRepository repository) 
    { 
     _repo = repository; 
    } 
    ... 

भूमिका प्रदाता

public class NHibernateRoleProvider : RoleProvider 
{ 

    private IUserRepository _repo; 

    public NHibernateRoleProvider(IUserRepository repository) 
    { 
     _repo = repository; 
    } 
    ... 

मैं तो मेरे नियंत्रक कॉन्फ़िगर एक अधिकृत

[Authorize(Roles="Admin")] 
    public ActionResult Edit(int? id) 
    { 
     ... 

मैं इस त्रुटि की आवश्यकता होती है जब startin जी ऐप।

Parser Error Message: No parameterless constructor defined for this object. 

Source Error: 


Line 49:  <roleManager enabled="true"> 
Line 50:  <providers> 
Line 51:   <add name="MyRolesProvider" type="MyApp.Models.NHibernateRoleProvider" 
Line 52:    applicationName="myApp" /> 
Line 53:  </providers> 

मैं इतना भंडार ठीक इंजेक्शन की जा रही है, सदस्यता प्रदाता के माध्यम से उन तक पहुँच सकते हैं, लेकिन भूमिकाओं प्रदाता अलग हो रहा है। रोल प्रदाता को कन्स्ट्रक्टर-कम पैरामीटर की आवश्यकता क्यों होती है? निनजेक्ट के साथ भूमिका प्रदाता को काम करने का कोई आसान तरीका है। किसी भी मदद की सराहना की।

+0

मैं अब भूमिका प्रदाता अधिकांश समय काम करना, लेकिन अगर मैं उपयोगकर्ता को प्रमाणीकृत करने का प्रयास करता हूं, तो लोड प्रदाता प्रदाता में भंडार का संदर्भ नहीं है (यह शून्य है)। यकीन नहीं है कि यह क्यों हो रहा है। – Matt

+2

भंडार शून्य है कि कारण यह है कि निनजेक्टर भूमिका प्रदाता नहीं बना रहा है। यह एएसपी.नेट ढांचे द्वारा बनाया गया है, जो बदले में बहुत ही दोस्ताना नहीं है। यही कारण है कि इसे एक पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता होती है। – mrydengren

उत्तर

16

भूमिका प्रदाता के बाद से, इस मामले में NHSPernateRoleProvider को एएसपी.NET ढांचे द्वारा तत्काल किया जाता है, सबसे अच्छा समाधान सेवा लोकेटर पैटर्न का उपयोग करना है। सेवा लोकेटर पैटर्न को आमतौर पर anti-pattern माना जाता है लेकिन कभी-कभी आपको व्यावहारिक होना चाहिए और उपयोग किए जा रहे ढांचे पर सीमा को स्वीकार करना होगा (इस मामले में एएसपी.नेट ढांचे)।

मान लें कि आप निनजेक्ट के लिए IDependencyResolver इंटरफेस के कार्यान्वयन का उपयोग कर रहे हैं। निम्नलिखित कोड काम करना चाहिए।

public class NHibernateMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repo; 

    public NHibernateMembershipProvider() 
    { 
     _repo = DependencyResolver.Current.GetService<IUserRepository>(); 
    } 

    // ... 
} 
+0

IDependencyResolver इंटरफ़ेस का उपयोग करने का क्या फायदा है? – Matt

+0

वास्तव में कोई फायदा नहीं है। मैंने इसे इस उदाहरण में उपयोग किया क्योंकि यह मुझे सेवा लोकेटर पैटर्न के एक प्रसिद्ध अमूर्तता प्रदान करता है। – mrydengren

+1

कस्टम सदस्यता प्रदाता की संपत्ति में भंडार को इंजेक्ट करना एक विकल्प है जैसा कि यहां प्रदर्शित किया गया है - http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider- साथ-भंडार इंजेक्शन / – Baldy

2

वैकल्पिक रूप से, के रूप में यहाँ सचित्र आप Ninject.Web.Mvc nuget पैकेज आप हमेशा अपनी भूमिका प्रदाता पर संपत्ति इंजेक्शन का उपयोग कर सकते उपयोग कर रहे हैं:

ASP.NET MVC 3 Ninject Custom Membership and Role Provider