使用DI ninject抛出错误的自定义角色提供程序

时间:2011-11-23 20:20:34

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

我将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似乎主要是为控制器工作。

3 个答案:

答案 0 :(得分:4)

您正在编写角色提供者,但这些目前不支持DI。 MVC中的很多类都是DI感知的,这就是为什么你看到它与控制器协同工作的原因。

为了能够注入构造函数参数,DI容器必须负责创建您希望注入的对象。只是注册一个类型并不会让它可以定位。

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

答案 1 :(得分:0)

为了亲自设置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());

答案 2 :(得分:0)

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