依赖注入 - 控制器工厂

时间:2015-09-08 17:02:21

标签: c# asp.net-mvc

我正在尝试理解来自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)?将任何参数传递给返回新对象的函数,而不使用该参数的目标是什么?或许它确实如此,但我看不到它。

2 个答案:

答案 0 :(得分:0)

你是对的。 Home Controller不使用传入的RequestContext参数(混淆地命名为“controller”)。之所以存在,是因为字典被定义为

  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>