我正在读这篇文章: 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类的public中创建ILogger变量,当我实例化HomeController类时:
HomeController controller = new HomeController();
我说:
controller.logger = whatevervalue
就像我使用时一样:
HomeController controller = new HomeController(whatevervalue);
我相信通过以上我可以实现依赖注入。
那么为什么我需要在上面描述的场景中使用自定义控制器工厂呢?
答案 0 :(得分:1)
作者说我们需要创建一个自定义控制器工厂,因为默认控制器工厂不允许在我们无法实现依赖注入的控制器类中使用参数化的构造函数。
我想你可能误解了这篇文章的这一部分。问题不是你不能指定自己的构造函数,它需要任意数量的参数,问题是默认控制器工厂只会调用控制器的默认构造函数。所以,要清楚,请使用您的示例:
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
现在有三个独立的构造函数,其中两个需要相同数量的参数。此时,默认控制器工厂没有正确调用您想要的构造函数所需的信息 - 它只能猜测。
因此,您必须实现自己的控制器工厂的原因是让您有机会组成控制器所需的依赖项,这样您就可以自己为控制器调用正确的构造函数。