Asp.net-Mvc-3
在 MVC3 應用程序中將 Ninject 與自定義角色提供程序一起使用
我正在嘗試在 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>(); } // ... }