Как настроить пользовательский класс поставщика членства для использования репозитория?

#nhibernate #model-view-controller #repository #membership-provider #ninject-2

#nhibernate #модель-представление-контроллер #репозиторий #membership-provider #ninject-2

Вопрос:

Привет, это мой первый пост, поэтому я прошу понимания. Я просмотрел много сообщений, но не нашел решения.

Я хочу реализовать пользовательский класс membershiprovider с:

 namespace Mvc_car.Authorization 
{
public class SimpleMembershipProvider : MembershipProvider
{
    private NHibernateRepository<Uzytkownik> repo;

    ISession session;

    [Inject]
    public SimpleMembershipProvider(ISession session)
    {
        this.session = session;
    }

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        repo = new NHibernateRepository<Uzytkownik>(session);
        base.Initialize(name, config);
    }
  

мои привязки:

 kernel.Bind<ISession>().ToMethod(x => MvcApplication.SessionFactory.OpenSession()).InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(NHibernateRepository<>));
kernel.Inject(Membership.Provider); //either with or without that
  

Я изменил web.config:

 <membership defaultProvider="MyMembershipProvider">
  <providers>
    <clear/>
    <add name="MyMembershipProvider" type="Mvc_car.Authorization.SimpleMembershipProvider"/>
  </providers>
</membership>
  

после попытки регистрации возникает следующая ошибка:

Этот метод не может быть вызван на этапе предварительной инициализации приложения.

Ответ №1:

Решение этой проблемы довольно простое. В вашем классе, содержащем атрибут PreApplicationStartMethod, добавьте статический метод, подобный этому.

  public static class NinjectWebCommon 
 {
        public static void InjectProviders()
        {
            Bootstrapper.Kernel.Inject(Membership.Provider);
            Bootstrapper.Kernel.Inject(Roles.Provider);
        }

    ...

 }
  

При настройке вашего провайдера не вводите зависимости через конструктор. Вместо этого украсьте свойства атрибутом [Inject], подобным этому.

 public class DefaultMembershipProvider : MembershipProvider
{
    [Inject]
    public IUserRepository UserRepository { get; set; }
}
  

После этого все так же просто, как вызвать NinjectWebCommon.Вводите providers() из вашего глобального метода.asax Application_Start().

 public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        NinjectWebCommon.InjectProviders();
        ...
    }
}