Nhibernate 如何设置自定义成员资格提供程序类以使用存储库?

Nhibernate 如何设置自定义成员资格提供程序类以使用存储库?,nhibernate,model-view-controller,repository,membership-provider,ninject-2,Nhibernate,Model View Controller,Repository,Membership Provider,Ninject 2,嘿,这是我的第一篇博文,请大家谅解。我看了很多帖子,但没有找到解决办法 我想通过以下方式实现自定义MembershipProvider类: namespace Mvc_car.Authorization { public class SimpleMembershipProvider : MembershipProvider { private NHibernateRepository<Uzytkownik> repo; ISession session;

嘿,这是我的第一篇博文,请大家谅解。我看了很多帖子,但没有找到解决办法

我想通过以下方式实现自定义MembershipProvider类:

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);
    }
namespace Mvc\u car.Authorization
{
公共类SimpleMembershipProvider:MembershipProvider
{
私人非银行存款回购;
闭会期间会议;
[注入]
公共SimpleMembershipProvider(ISession会话)
{
this.session=会话;
}
public override void Initialize(字符串名称,System.Collections.Specialized.NameValueCollection配置)
{
回购=新的NHibernateRepository(会话);
初始化(名称、配置);
}
我的绑定:

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
kernel.Bind().ToMethod(x=>mvcapapplication.SessionFactory.OpenSession()).InRequestScope();
Bind(typeof(IRepository)).To(typeof(NHibernateRepository));
kernel.Inject(Membership.Provider);//有或没有
我在web.config中更改了:

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

尝试记录日志后,出现以下错误:

在应用程序的预启动初始化阶段无法调用此方法


解决这个问题的方法非常简单。在包含PreApplicationStartMethod属性的类中,添加如下静态方法

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

    ...

 }
public class DefaultMembershipProvider : MembershipProvider
{
    [Inject]
    public IUserRepository UserRepository { get; set; }
}
设置提供程序时,不要通过构造函数注入依赖项,而是使用如下[inject]属性装饰属性

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

    ...

 }
public class DefaultMembershipProvider : MembershipProvider
{
    [Inject]
    public IUserRepository UserRepository { get; set; }
}
之后,只需从global.asax应用程序_Start()方法调用NinjectWebCommon.InjectProviders()即可