我正在完成一个教程,我理解正在教授的内容,示例代码按照描述的方式工作。但我错过了一个拼图,这就是工厂如何知道使用哪个“创造”....所以我想我不明白所教的一切。
在尝试研究时,我遇到了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,因为那是食物的实体表示?
答案 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以及你应该如何使用它/设计它。