Asp.net mvc ASP.NET MVC在不使用任何DI代码的情况下解析具体类型
我有一个依赖于Asp.net mvc ASP.NET MVC在不使用任何DI代码的情况下解析具体类型,asp.net-mvc,asp.net-mvc-4,dependency-injection,ninject,Asp.net Mvc,Asp.net Mvc 4,Dependency Injection,Ninject,我有一个依赖于ImageReader和ImageWriter的控制器。我正在使用构造函数注入将这些类型注入控制器: public class MyController { private readonly ImageReader _imageReader; private readonly ImageWriter _imageWriter; public MyController(ImageReader imageReader, ImageWriter imageWri
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):
公共静态类NinjectWebCommon
{
//一些代码。。。。
私有静态无效注册服务(IKernel内核)
{
//我忘了在这里包括ImageReader
kernel.Bind().ToSelf().InRequestScope();
}
}
代码怎么可能运行良好?ASP.NET MVC知道如何独立解析具体类型吗
我正在使用ASP.NET MVC 4和.NET 4.6多亏@Nkosi的评论,我找到了答案 这是因为Ninject的: 如果您正在解析的类型是具体类型(如上面的武士), Ninject将通过 称为隐式自绑定的机制。就好像有一个 注册方式如下:
Bind().To()代码>
在我上面的例子中,由于ImageReader
是一个具体类型,ninject会自动解析它。我认为ninject默认返回到Activator,用于无依赖项初始化的具体类。只有在这种情况下,它才会与transient相同,因为每个请求都将使用一个新实例。我假设您正在使用Ninjects IDependencyResolver实现。请检查,非常感谢@Nkosi。这就解释了。我以为是MVC解决了这个问题。。。事实证明,这是一件令人讨厌的事。为了证明这一点。将一个注入的依赖项更改为接口,并且不注册它。它会爆炸的。
public static class NinjectWebCommon
{
// some code....
private static void RegisterServices(IKernel kernel)
{
// I had forgotten to include ImageReader here
kernel.Bind<ImageWriter>().ToSelf().InRequestScope();
}
}