依赖项注入-控制器工厂
本文关键字:控制器 工厂 注入 依赖 | 更新日期: 2023-09-27 18:11:49
我试图理解一篇关于依赖项注入的文章中的示例代码。
所以基本上,有一个控制器工厂有字典。键是字符串,值是取RequestContext
并返回IController
对象的函数。
public class MyControllerFactory:DefaultControllerFactory
{
private Dictionary<string, Func<RequestContext, IController>> controllers;
public MyControllerFactory(ICustomerRepository repository)
{
controllers = new Dictionary<string, Func<RequestContext, IController>>();
controllers["Home"] = controller => new HomeController(repository);
}
public override IController CreateController(RequestContext requestContext, string controllerName)
{
if(controllers.ContainsKey(controllerName))
{
return controllers[controllerName](requestContext);
}
else
{
return null;
}
}
}
下面的行AFAIK添加了一个用lambda表达式定义的函数(它以controller
为参数并返回new HomeController(repository)
(。
controllers["Home"] = controller => new HomeController(repository);
现在,如果函数只返回new HomeController(repository)
而不执行任何操作,那么需要RequestContext参数(上面称为controller
(有什么意义呢?将任何参数传递给返回新对象的函数,而不使用该参数的目的是什么?或者可能有,但我看不见。
函数需要接受一个参数才能匹配Func<RequestContext, IController>
签名。λcontroller => new HomeController(repository)
最终等效于以下方法:
IController function(RequestContext context)
{
return new HomeController(repository);
}
我们可以看到,这与Func<RequestContext, IController>
的签名相匹配:(当然,编译器实际上并没有生成这个(
delegate IController Function(RequestContext context);
在字典中用作项的任何函数都必须与该签名匹配。
换句话说,在这种情况下,带单个参数的lambda是Func<RequestContext, IController>
,这与无参数lambda(即Func<IController>
(根本不同。
你说得对。这里的主控制器不使用传入的RequestContext参数(名称混乱的"控制器"(。它之所以存在是因为字典被定义为
private Dictionary<string, Func<RequestContext, IController>> controllers;
Func<RequestContext, IController>
是一个需要返回控制器的函数。家庭控制器的工厂功能不需要请求上下文;这只是一个调用new HomeController(repository)
的单行函数,但完全有可能一个更复杂的控制器需要RequestContext才能创建。
我应该补充一点,这个教程似乎不是写得最好的。如果没有使用请求上下文,我就不会在字典中添加它的要求。