我将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似乎主要是为控制器工作。
答案 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扩展程序。