加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何为MVC4配置Ninject并提供自定义成员资格?

发布时间:2020-12-15 23:54:26 所属栏目:asp.Net 来源:网络整理
导读:根据这篇文章描述 custom-membership-provider-with-repository-injection 我实现自定义成员资格提供注入. 定制会员提供商 using Ninject;public class CustomMembershipProvider : MembershipProvider{ [Inject] public IUserRepository UserRepository { g
根据这篇文章描述 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);
}

当我运行应用程序时,我收到错误

This method cannot be called during the application’s pre-start
initialization stage.

来自kernel.Inject(Membership.Provider);这条线

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

我得到了吼叫错误

Error activating IUserRepository No matching bindings are available,
and the type is not self-bindable. Activation path: 2) Injection of
dependency IUserRepository into property UserRepository of type
CustomMembershipProvider 1) Request for CustomeMembershipProvider

怎么解决这个问题. ??

解决方法

我在尝试这个时遇到了很多麻烦,最后添加了一个让我获得存储库的方法
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>();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读