嘿,这是我的第一篇文章,所以我要求理解。我看过很多帖子,但我找不到解决方案。
我想用以下方法实现自定义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>
尝试记录后发生以下错误:
在应用程序的预启动初始化阶段,无法调用此方法。
答案 0 :(得分:0)
解决方法非常简单。在包含PreApplicationStartMethod属性的类中,添加一个这样的静态方法。
public static class NinjectWebCommon
{
public static void InjectProviders()
{
Bootstrapper.Kernel.Inject(Membership.Provider);
Bootstrapper.Kernel.Inject(Roles.Provider);
}
...
}
设置Provider时,不要通过构造函数注入依赖项。而是使用像这样的[Inject]属性来装饰属性。
public class DefaultMembershipProvider : MembershipProvider
{
[Inject]
public IUserRepository UserRepository { get; set; }
}
之后,就像从global.asax Application_Start()方法调用NinjectWebCommon.InjectProviders()一样简单。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
NinjectWebCommon.InjectProviders();
...
}
}