2014-12-05 99 views
2

我正在运行一个教程,我理解正在教什么,示例代码如上所述工作。但我错过了拼图的一部分,这就是工厂如何知道使用哪个“创造”......所以我想我不明白所教的一切。这个模型工厂如何知道使用哪种方法?

在试图研究我碰到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() 
     { ... }; 
    } 
} 

有一些隐含的关联,因为“查询”是食物的种类和modelFactory说哦,我会使用FoodModel,因为那是食物的实体表示形式?

回答

4

在这一行:

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以及如何使用它/设计它。

+0

但是对我来说有一些微软的魔力。我实例化ModelFactory ...它没有创建...它自动知道。 – GPGVM 2014-12-05 16:22:42

+1

我不确定你的意思 - 你的示例代码在'ModelFactory'类中有两个'Create'方法。 'Create'只是一个方法名称,不是构造函数或任何特殊的东西。 – 2014-12-05 16:25:08

相关问题