我正在尝试理解来自an article的关于依赖注入的示例代码。
所以基本上,有一个带字典的控制器工厂。键是字符串,值是带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);
现在,如果函数对它没有任何作用,需要一个RequestContext参数(上面名为controller
)有什么意义,因为它只返回new HomeController(repository)
?将任何参数传递给返回新对象的函数,而不使用该参数的目标是什么?或许它确实如此,但我看不到它。
答案 0 :(得分:0)
private Dictionary<string, Func<RequestContext, IController>> controllers;
Func<RequestContext, IController>
是一个需要返回控制器的函数。 Home Controller的工厂功能不需要请求上下文;它只是一个调用new HomeController(repository)
的单行函数,但是更复杂的控制器完全有可能需要RequestContext才能被创建。
我应该补充一点,这个教程似乎写得不是很好。如果没有使用请求上下文,我就不会在字典中添加要求。
答案 1 :(得分:0)
需要该函数来获取参数以匹配Func<RequestContext, IController>
签名。 lambda 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>
。< / p>