2014-12-05 93 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

相關問題