Asp.net-Mvc-3

在 MVC3 應用程序中將 Ninject 與自定義角色提供程序一起使用

  • April 10, 2013

我正在嘗試在 MVC3 應用程序中使用自定義角色提供程序。我已經使用 Ninject 讓會員提供程序正常工作,但似乎無法讓角色提供程序工作。Membership 提供者不需要無參數建構子,但角色提供者需要。以下是一些程式碼片段:

網頁配置

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

啟動應用程序時出現此錯誤。

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 一起工作。任何幫助表示讚賞。

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

假設您正在為 Ninject 使用IDependencyResolver介面的實現。以下程式碼應該可以工作。

public class NHibernateMembershipProvider : MembershipProvider
{
   private IUserRepository _repo;

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

   // ...
}

引用自:https://stackoverflow.com/questions/6519720