3

根据本文描述custom-membership-provider-with-repository-injection

我实现了通过注入提供的自定义会员资格。

自定义会员提供者

using Ninject;

public class CustomMembershipProvider : MembershipProvider
{
        [Inject]
        public IUserRepository UserRepository { get; set; }

[...]

自定义角色提供者

using Ninject;

public class CustomRoleProvider : RoleProvider
{
      [Inject]
      public IUserRoleRepository UserRoleRepository { get; set; }
[...]

Web.Config中

<membership defaultProvider="CustomsMembershipProvider">
      <providers>
        <clear/>
        <add name="CustomsMembershipProvider" type="namespace.CustomsMembershipProvider"/>
      </providers>
</membership>
<roleManager enabled="true" defaultProvider="customRoleProvider">
      <providers>
        <clear/>
        <add name="customRoleProvider" type="namespace.customRoleProvider"/>
      </providers>
</roleManager>

现在在NinjectWebCommon

private static IKernel CreateKernel()
{
      var kernel = new StandardKernel();
      kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

      RegisterServices(kernel);
      return kernel;
}

private static void RegisterServices(IKernel kernel)
{
  [...]

  kernel.Bind<IUserRepository>().To<UserRepository>();
  kernel.Bind<IUserRoleRepository>().To<UserRoleRepository>();

  // Inject user & role repository into our custom membership & role providers.
   kernel.Inject(Membership.Provider);
   kernel.Inject(Roles.Provider);
}

当我运行应用程序时出现错误

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

从这 kernel.Inject(Membership.Provider);条线

但是如果我将内核设置放在Application_Start中

我得到以下错误

激活 IUserRepository 时出错 没有匹配的绑定可用,并且类型不是自绑定的。激活路径: 2) 将依赖 IUserRepository 注入到 CustomMembershipProvider 类型的属性 UserRepository 1) 对 CustomeMembershipProvider 的请求

如何解决。??

4

3 回答 3

8

结果始终为空。为什么?因为asp.net 有它自己的成员静态属性。

这是membership.provider。并且此实例不是实例 ninject 管理的一部分。

要解决它,您需要使用 kernel.inject。但是在生成 aspnetmvc.cs 时,您会看到它是在 PreApplicationStart 事件中注入的,并且不会让您这样做。

这是cipto为我解决问题的解决方案。将此添加到您的 NinjectWebCommon

    [assembly: WebActivator.PreApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Start")]
    [assembly: WebActivator.PostApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "RegisterMembership")]
    [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Stop")]

    public static void RegisterMembership()
    {
        bootstrapper.Kernel.Inject(Membership.Provider);
    } 

文章链接:Ninject 和 customMembership asp.net mvc 3

于 2013-04-20T14:48:09.760 回答
2

我在尝试这个时遇到了很多麻烦,最后添加了一个让我获得存储库的方法

using System.Web.Mvc;  //Used to access dependency resolver

    private IUserRepository GetUserRepository()
    {
        return DependencyResolver.Current.GetService<IUserRepository>();
    }

然后我在需要它的方法中调用它

我能够使用构造函数注入来注入存储库,但是一旦我去使用存储库,对象就被释放了。我发现上面是最简单的选择。

但是,我想您也可以使用该Initialize()方法

    IUserRepository userRepository;
    public override void Initialize(string name, NameValueCollection config)
    {
        base.Initialize(name, config);
        this.userRepository = DependencyResolver.Current.GetService<IUserRepository>();
    }

或者另一种方式是使用属性

public IUserRepository UserRepository
{
    get
    {
        return DependencyResolver.Current.GetService<IUserRepository>();
    }
}
于 2013-01-19T07:51:25.127 回答
1

由于 customRoleProvider经常与 custom 一起出现MembershipProvider,在这种情况下,为 Role Provider 类添加注入很有用。我使用了ramon22 的解决方案,并增加了一行。

[assembly: WebActivator.PreApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "RegisterMembership")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Stop")]

public static void RegisterMembership()
{
    bootstrapper.Kernel.Inject(Membership.Provider);
    bootstrapper.Kernel.Inject(Roles.Provider);
} 
于 2014-10-10T08:57:27.820 回答