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

时间:2011-05-28 17:10:46

标签: nhibernate model-view-controller repository 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 个答案:

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