【问题标题】:Custom Role Provider using DI ninject throwing error使用 DI ninject 引发错误的自定义角色提供程序
【发布时间】:2011-11-23 20:20:33
【问题描述】:

我将 CustomRoleProver 设置为:

public class CustomRoleProvider : RoleProvider
    {
        private readonly IRepository<User> _repository;

        public CustomRoleProvider(IRepository<User> repository)
        {
            _repository = repository;
        }

...

在我的 Global.asax.cs 我有:

//Create Ninject DI kernel
            var kernel = new StandardKernel();

            kernel.Bind<IRepository<User>>().To<Repository<User>>();

            //Tell ASP.NET MVC 3 to use our Ninject DI Container
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));

当我尝试运行我的代码时,我得到:

配置错误 说明:处理服务此请求所需的配置文件期间发生错误。请查看下面的具体错误详情并适当修改您的配置文件。

解析器错误消息:没有为此对象定义无参数构造函数。

来源错误:

第 64 行: 第 65 行: 第 66 行: 第 67 行: 第 68 行:

所以也许我对 DI 和 ninject 的理解完全不正确。我认为当它尝试实例化 CustomRoleProvider 时,它会创建用户存储库并将其传递给构造函数,而不是尝试使用无参数的存储库。

是我理解错误还是我的设置不正确?

我觉得这很奇怪,因为 DI 似乎主要为控制器工作。

【问题讨论】:

    标签: asp.net-mvc dependency-injection ninject


    【解决方案1】:

    您正在编写一个角色提供程序,但这些当前不支持 DI。 MVC 中的许多类都支持 DI,这就是为什么您会看到它与控制器一起工作。

    为了能够注入构造函数参数,DI 容器必须负责创建您希望注入的对象。仅仅注册一个类型并不能神奇地使其可定位。

    对于 roleproviders,框架中的 Roles 类创建提供者的实例,包括您的自定义提供者。它仅适用于无参数构造函数。您需要在自定义提供程序中使用属性注入之类的东西,并使用 Roles.Provider 获取实例以注入您的依赖项。

    【讨论】:

      【解决方案2】:

      为了亲自设置 Ninject,我将在您的项目中创建一个工厂类,如下所示。

      注意,配置 DI 绑定的 AddBindings 方法。

      public class NinjectControllerFactory : DefaultControllerFactory
      {
          private IKernel ninjectKernel;
          public NinjectControllerFactory()
          {
              ninjectKernel = new StandardKernel();
              AddBindings();
          }
          protected override IController GetControllerInstance(RequestContext requestContext,
          Type controllerType)
          {
              return controllerType == null
              ? null
              : (IController)ninjectKernel.Get(controllerType);
          }
          private void AddBindings()
          {
              // put bindings here
              ninjectKernel.Bind<IRepository<User>>().To<Repository<User>>();
          }
      }
      

      在 Global.asax.cs 的 Application_Start 中注册工厂:

      ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
      

      【讨论】:

        【解决方案3】:

        您很可能使用了无效的自定义依赖关系解析器。阅读https://github.com/ninject/ninject.web.mvc/wiki/MVC3,了解如何改用 Ninject.MVC3 扩展。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多