Использование Ninject с поставщиком пользовательских ролей в приложении MVC3 - PullRequest
9 голосов
/ 29 июня 2011

Я пытаюсь использовать пользовательский поставщик ролей в приложении 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)
    {
       ...

Я получаю эту ошибку при запускеapp.

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.Любая помощь приветствуется.

Ответы [ 2 ]

18 голосов
/ 30 июня 2011

Поскольку поставщик ролей, в этом случае NHibernateRoleProvider создается в ASP.NET Framework, лучшим решением будет использование шаблона поиска служб.Шаблон локатора службы обычно считается анти-шаблоном , но иногда вам нужно быть прагматичным и принять ограничение на используемую платформу (в данном случае каркас ASP.NET).*

Предполагается, что вы используете реализацию интерфейса IDependencyResolver для Ninject.Следующий код должен работать.

public class NHibernateMembershipProvider : MembershipProvider
{
    private IUserRepository _repo;

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

    // ...
}
3 голосов
/ 10 апреля 2013

В качестве альтернативы, если вы используете пакет nuget Ninject.Web.Mvc, вы всегда можете использовать внедрение свойств для своего поставщика ролей, как показано здесь:

Поставщик нестандартного членства и роли ASP.NET MVC 3

...