带有Ninject的MVC项目中的IDependencyResolver

时间:2015-08-08 19:26:58

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

我正在阅读弗里曼的书“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的实现,但这些方法永远不会被调用。

0 个答案:

没有答案