如何配置Ninject为MVC4和定制会员提供?(How to configure Ninject

2019-07-18 10:23发布

根据这篇文章的描述定制的会员制提供商与系统信息库注射

我实现自定义成员与注射提供。

定义成员资格提供

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 1的属性UserRepository)请求CustomeMembershipProvider

如何解决。 ??

Answer 1:

我有很多的尝试这个麻烦,最终补充说,让我仓库里的方法

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


Answer 2:

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

这是membership.provider。 而这种情况下是不是实例ninject管理的一部分。

要解决它,你需要使用kernel.inject。 但对产生aspnetmvc.cs你会看到它的注射PreApplicationStart事件,不会让你失望。

这里是通过解决问题,我cipto的soloution。 添加到您的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



Answer 3:

由于自定义RoleProvider经常与自定义走来MembershipProvider ,在这种情况下,它是有用的添加注射角色提供类。 我用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);
} 


文章来源: How to configure Ninject for MVC4 & custom Membership provide?