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

时间:2014-12-05 16:16:06

标签: c# factory-pattern

我正在完成一个教程,我理解正在教授的内容,示例代码按照描述的方式工作。但我错过了一个拼图,这就是工厂如何知道使用哪个“创造”....所以我想我不明白所教的一切。

在尝试研究时,我遇到了this article,但由于他们的情况略有不同,所以没有回答我的“知道怎么样”的问题。

_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;
}

在模型工厂中有两个创建

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

   public MeasureModel Create(Measure measure)
   {
      return new MeasureModel()
      { ... };
   }
}

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

1 个答案:

答案 0 :(得分:5)

在这一行:

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

f变量的类型为Food,因为它来自IQueryable<Food>实例。所以Create(Food food)重载是被调用的重载。

真的没有魔法,只是基于参数类型匹配的标准成员重载和重载选择 - read this article for an explanation of how overloading works以及你应该如何使用它/设计它。