#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();
...
}
}