2011-06-29 16 views
8

Próbuję użyć niestandardowego dostawcy roli w aplikacji MVC3. Dostałem już dostawcę członkostwa działającego w porządku przy użyciu programu Ninject, ale nie wydaje się, aby działał dostawca roli. Dostawca członkostwa nie wymaga konstruktora bez parametrów, ale robi to dostawca roli. Oto niektóre fragmenty kodu:Używanie programu Ninject z niestandardowym dostawcą ról w aplikacji MVC3

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> 

Mam moduł 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>(); 
    } 
} 

Dostawca zwyczaj Członkostwo

public class NHibernateMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repo; 

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

Rola dostawcy

public class NHibernateRoleProvider : RoleProvider 
{ 

    private IUserRepository _repo; 

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

I następnie skonfigurować mój kontroler wymaga autoryzacji

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

otrzymuję ten błąd podczas startin g aplikacji.

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> 

mogę uzyskać dostęp do użytkowników przez dostawcę członkostwa, więc repozytorium jest wstrzykiwany ok, ale usługodawca ról wydaje się być inna. Dlaczego dostawca roli wymaga parametru bez konstruktora? Czy istnieje prosty sposób na uzyskanie dostawcy roli do pracy z programem Ninject? Każda pomoc doceniona.

+0

teraz mam dostawcy roli działający przez większość czasu, ale jeśli spróbuję uwierzytelnić użytkownika, załadowany dostawca roli nie ma odwołania do repozytorium (jest to wartość null). Nie wiem, dlaczego tak się dzieje. – Matt

+2

Powodem, dla którego repozytorium ma wartość null, jest to, że program Ninject nie tworzy dostawcy roli. Jest tworzony przez środowisko ASP.NET, które z kolei nie jest bardzo przyjazne dla DI. Dlatego wymaga konstruktora bez parametrów. – mrydengren

Odpowiedz

16

Ponieważ dostawca roli, w tym przypadku instancja NHibernateRoleProvider jest tworzona przez środowisko ASP.NET, najlepszym rozwiązaniem jest użycie wzorca lokalizatora usług. Wzorzec lokalizatora usług jest zwykle uznawany za anti-pattern, ale czasami trzeba być pragmatycznym i zaakceptować ograniczenia stosowanej platformy (w tym przypadku środowiska ASP.NET).

Zakładając, że używasz implementacji interfejsu IDependencyResolver dla programu Ninject. Poniższy kod powinien działać.

public class NHibernateMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repo; 

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

    // ... 
} 
+0

Jaka jest zaleta korzystania z interfejsu IDependencyResolver? – Matt

+0

Nie ma żadnej korzyści. Użyłem go w tym przykładzie, ponieważ dostarczył mi znaną abstrakcję wzorca Lokalizatora usług. – mrydengren

+1

Alternatywą jest wstawienie repozytorium do właściwości niestandardowego dostawcy członkostwa, jak pokazano tutaj - http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider- z iniekcją-repozytorium / – Baldy

Powiązane problemy