ASP.NET MVC 在没有任何 DI 代码的情况下解析具体类型

ASP.NET MVC resolving concrete types without any DI code

我有一个依赖于 ImageReaderImageWriter 的控制器。我正在使用构造函数注入将这些类型注入控制器:

public class MyController
{
    private readonly ImageReader _imageReader;
    private readonly ImageWriter _imageWriter;

    public MyController(ImageReader imageReader, ImageWriter imageWriter)
    {
        _imageReader = imageReader;
        _imageWriter = imageWriter;
    }

    // more code ...
}

ImageReaderImageWriter 被分类为没有依赖性(即它们可以在没有任何构造函数参数的情况下进行初始化)。

问题

我有这个代码 运行 非常好......但我刚刚意识到我忘记在我的 DI 代码中注册 ImageReader(使用 Ninject):

public static class NinjectWebCommon
{
    // some code....

    private static void RegisterServices(IKernel kernel)
    {
        // I had forgotten to include ImageReader here
        kernel.Bind<ImageWriter>().ToSelf().InRequestScope();
    }
}

代码怎么可能 运行 没问题? ASP.NET MVC 知道如何自行解析具体类型吗?

我正在使用 ASP.NET MVC 4 和 .NET 4.6

感谢@Nkosi 的评论,我找到了答案。

这是因为 Ninject 的 implicit self binding:

if the type you’re resolving is a concrete type (like Samurai above), Ninject will automatically create a default association via a mechanism called implicit self binding. It’s as if there’s a registration like this:

Bind<Samurai>().To<Samurai>();

在我上面的示例中,由于 ImageReader 是具体类型,ninject 会自动解析它。