该模型工厂如何知道使用哪种方法?

GPG*_*GVM 2 c# factory-pattern

我正在完成一个教程,我理解正在教授的内容,示例代码的工作原理如上所述.但我错过了一个难题,那就是工厂如何知道使用哪个"创造"....所以我想我不明白所教的一切.

在尝试研究时,我遇到了这篇文章,但由于他们的情况略有不同,因此没有回答我的"它是怎么知道"的问题.

_modelFactory.Create(f)令我感到困惑.

这是正在执行的代码

_modelFactory = new ModelFactory();
...snip....


public IEnumerable<FoodModel> Get(bool includeMeasures = true)
{
  IQueryable<Food> query;

  if (includeMeasures)
  { query = _repo.GetAllFoodsWithMeasures(); }
  else
  { query = _repo.GetAllFoods(); }

  var results = query.OrderBy(f => f.Description).Select(f => _modelFactory.Create(f));

  return results;
}
Run Code Online (Sandbox Code Playgroud)

在模型工厂中有两个创建

public class ModelFactory
{
   public FoodModel Create(Food food)
   {
     return new FoodModel()
     { ... };
   }

   public MeasureModel Create(Measure measure)
   {
      return new MeasureModel()
      { ... };
   }
}
Run Code Online (Sandbox Code Playgroud)

是否存在一些隐式关联,因为"查询"属于Food类型而modelFactory表示哦,我将使用FoodModel,因为这是食物的实体表示?

tom*_*ich 5

在这一行:

var results = query.OrderBy(f => f.Description).Select(f => _modelFactory.Create(f));
Run Code Online (Sandbox Code Playgroud)

f变量的类型的Food,因为它是从未来的IQueryable<Food>实例.因此,Create(Food food)重载是被调用的.

真的没有魔法,只是基于参数的类型匹配的标准成员重载和重载选择 - 阅读本文以解释过载如何工作以及如何使用它/设计它.