【问题标题】:How to set up custom membership provider class to use repository?如何设置自定义会员提供程序类以使用存储库?
【发布时间】:2011-09-04 00:33:11
【问题描述】:

嘿,这是我的第一篇文章,所以我请求理解。我看了很多帖子,但没有找到解决办法。

我想通过以下方式实现自定义会员提供者类:

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>

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

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

【问题讨论】:

    标签: nhibernate model-view-controller repository membership-provider ninject-2


    【解决方案1】:

    解决方案非常简单。在包含 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();
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      相关资源
      最近更新 更多