ASP.NET MVC 在没有任何 DI 代码的情况下解析具体类型
ASP.NET MVC resolving concrete types without any DI code
我有一个依赖于 ImageReader
和 ImageWriter
的控制器。我正在使用构造函数注入将这些类型注入控制器:
public class MyController
{
private readonly ImageReader _imageReader;
private readonly ImageWriter _imageWriter;
public MyController(ImageReader imageReader, ImageWriter imageWriter)
{
_imageReader = imageReader;
_imageWriter = imageWriter;
}
// more code ...
}
ImageReader
和 ImageWriter
被分类为没有依赖性(即它们可以在没有任何构造函数参数的情况下进行初始化)。
问题
我有这个代码 运行 非常好......但我刚刚意识到我忘记在我的 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 会自动解析它。
我有一个依赖于 ImageReader
和 ImageWriter
的控制器。我正在使用构造函数注入将这些类型注入控制器:
public class MyController
{
private readonly ImageReader _imageReader;
private readonly ImageWriter _imageWriter;
public MyController(ImageReader imageReader, ImageWriter imageWriter)
{
_imageReader = imageReader;
_imageWriter = imageWriter;
}
// more code ...
}
ImageReader
和 ImageWriter
被分类为没有依赖性(即它们可以在没有任何构造函数参数的情况下进行初始化)。
问题
我有这个代码 运行 非常好......但我刚刚意识到我忘记在我的 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 会自动解析它。