我正在阅读本文:http : //www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be作者说我们需要创建一个自定义控制器工厂,因为默认控制器工厂不允许在无法实现依赖注入的控制器类中使用无参构造函数。但是,我相信我们可以创建一个不带参数的空构造函数,而另一个可以接受参数的构造函数,这样可以避免创建自定义控制器工厂的麻烦,如下图所示。
例如下面的代码:
public class HomeController : Controller
{
private readonly ILogger _logger;
public HomeController()
{
}
public HomeController(ILogger logger)
{
_logger = logger;
}
}
我可以在HomeController类中以及当实例化HomeController类时使ILogger变量公开:
HomeController controller = new HomeController();
我放:
controller.logger = whatevervalue
就像我使用时一样:
HomeController controller = new HomeController(whatevervalue);
我相信以上内容可以实现依赖注入。
那么,为什么在上述情况下需要自定义控制器工厂?
作者说,我们需要创建一个自定义的控制器工厂,因为默认的控制器工厂不允许在无法实现依赖注入的控制器类中使用无参构造函数。
我认为您可能误解了本文的这一部分。问题不在于您不能指定自己的构造函数,该构造函数需要任意数量的参数,而是默认控制器工厂只会调用控制器的默认构造函数。因此,很明显,使用您的示例:
public class HomeController : Controller
{
private readonly ILogger _logger;
public HomeController()
{
}
public HomeController(ILogger logger)
{
_logger = logger;
}
}
当实例化的实例时HomeController
,默认控制器工厂将始终调用此构造函数:
public HomeController()
不是这个:
public HomeController(ILogger logger)
这意味着ILogger
实例将始终为null
。
所以现在的问题是,为什么默认控制器工厂只调用默认构造函数?我们可以通过问另一个问题来回答:默认控制器工厂如何知道您要调用哪个构造函数?如果您说“嗯,它可以调用参数最多的那个”,那么如果添加第三个构造函数,将会发生什么:
public HomeController(IService service)
HomeController
现在有三个单独的构造函数,其中两个需要相同数量的参数。在这一点上,默认控制器工厂不具备正确调用您想要的构造函数所需的信息-它只能猜测。
因此,必须实现自己的控制器工厂的原因是使您有机会组合控制器所需的依赖项,以便随后可以为控制器自己调用正确的构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句