依赖项注入-控制器工厂

本文关键字:控制器 工厂 注入 依赖 | 更新日期: 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才能创建。

我应该补充一点,这个教程似乎不是写得最好的。如果没有使用请求上下文,我就不会在字典中添加它的要求。