2011-06-29 162 views
8

我試圖在MVC3應用程序中使用自定義角色提供程序。我已經有了使用Ninject的會員供應商,但似乎無法讓角色提供商工作。成員資格提供程序不需要無參數構造函數,但角色提供程序需要。下面是一些代碼片段:在MVC3應用程序中使用Ninject與自定義角色提供程序

的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) 
    { 
     ... 

我得到這個錯誤挑動時g應用程序。

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> 

我可以通過會員提供商訪問用戶,這樣倉庫被注入確定,但角色提供商似乎是不同的。爲什麼角色提供者需要一個無構造函數的參數?是否有一種簡單的方法讓角色提供者與Ninject一起工作。任何幫助讚賞。

+0

我現在有角色提供大部分時間都在工作,但如果我嘗試驗證用戶,則加載的角色提供者沒有對存儲庫的引用(它爲空)。不知道爲什麼會這樣。 – Matt

+2

存儲庫爲空的原因是Ninject未創建角色提供程序。它是由ASP.NET框架創建的,而該框架又不是非常友好的。這就是爲什麼它需要一個無參數的構造函數。 – mrydengren

回答

16

由於角色提供者,在這種情況下,NHibernateRoleProvider由ASP.NET框架實例化,所以最好的解決方案是使用服務定位器模式。服務定位器模式通常被認爲是anti-pattern,但有時您必須務實並接受對正在使用的框架(在本例中爲ASP.NET框架)的限制。

假設您正在使用Ninject的IDependencyResolver接口的實現。下面的代碼應該可以工作。

public class NHibernateMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repo; 

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

    // ... 
} 
+0

使用IDependencyResolver接口的優點是什麼? – Matt

+0

真的沒有優勢。我在這個例子中使用了它,因爲它爲我提供了Service Locator模式的一個衆所周知的抽象。 – mrydengren

+1

另一種方法是將存儲庫注入自定義成員資格提供程序的屬性,如此處所示 - http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-與存儲庫注入/ – Baldy

相關問題