我正在阅读弗里曼的书“Pro ASP.NET MVC 5,第5版”,并且有些事情没有意义。如果有人跟进,这是第6章。作者使用Ninject进行DI。
NinjectWebWebCommons.cs 文件有一个方法RegisterServices()
,我们在其中指定IDependencyResolver
实现:
private static void RegisterServices(IKernel kernel) {
// This is where we tell MVC to use our custom DependencyResolver.
System.Web.Mvc.DependencyResolver.SetResolver(new
EssentialTools.Infrastructure.NinjectDependencyResolver(kernel));
}
我在上面的代码上放了一个断点,正如预期的那样,它被点击了。
现在我进入EssentialTools.Infrastructure.NinjectDependencyResolver
班。这是实现IDependencyResolver
的类。班级'c'tor看起来像这样:
public NinjectDependencyResolver(IKernel kernelParam) {
kernel = kernelParam;
kernel.Bind<IValueCalculator>().To<LinqValueCalculator>().InRequestScope();
kernel.Bind<IDiscountHelper>().To<DefaultDiscountHelper>().WithPropertyValue("DiscountSize", 2.5M);
kernel.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();
}
在c'tor中设置断点也有效。断点被击中。
由于NinjectDependencyResolver
类实现了IDependencyResolver
,它有两种接口实现方法:
public object GetService(Type serviceType) {
return kernel.TryGet(serviceType);
}
和
public object GetServices(Type serviceType) {
return kernel.GetAll(serviceType);
}
这是我不理解的东西 - 这两种方法都没有被调用!我甚至用以下方法替换了两种方法的内容:
throw null;
一切都还行。没有例外被抛出。
有人可以解释为什么这些方法都没有被调用?我的(可能是不正确的)理解是MVC框架将调用这些方法来检索特定Type
的实现,但这些方法永远不会被调用。