2016-11-08 86 views
1

對於ASP.NET MVC和編程通常是新的。我有一個方法構建一個ViewModel,我在其他大部分視圖中都使用它,並且有兩個重載。我想從第二個重載撥打第一個重載更有效率,所以我這樣做:從另一個調用一個重載的方法來構建ViewModel C#/ ASP.NET MVC

public HeaderViewModel BuildHeaderViewModel(int? chainId, int? sheetId) 
{ 
    HeaderViewModel header = new HeaderViewModel(); 

    header.ChainName = db.Chains.Find(chainId).Name; 
    header.SheetName = db.Sheets.Find(sheetId).Name; 
    header.SheetDescription = db.Sheets.Find(sheetId).Description; 

    return header; 
} 

public HeaderViewModel BuildHeaderViewModel(int? chainId, int? sheetId, int? fileId) 
{ 
    HeaderViewModel header = new HeaderViewModel(); 

    header = BuildHeaderViewModel(chainId, sheetId); // calling first overload 

    var fileDetails = db.FileDetails.Find(fileId); 
    header.SheetFileName = fileDetails.Name + fileDetails.Extension; 

    return header; 
} 

我的問題是,這是這樣做的正確的/最有效的方法是什麼?任何輸入將不勝感激。

+3

常見模式是讓構造函數採用最少的參數調用構造函數,該構造函數接受的參數最多。通常使用':this(...)'。 – haim770

+1

好點。只有「構造函數」似乎被誤用了。這些只是方法。我認爲OP意味着「構造函數」在這些方法中創建並返回一個對象實例,但這顯然不是正確的術語。 –

+0

我便從努力在尋找到'':this'',但我真的不明白。我認爲是因爲我反其道而行之,讓構造函數的參數調用最少的參數。另外,感謝澄清我的術語@ChrisPratt! – justiceorjustus

回答

3

其實,使用鏈條過載典型方法是讓廣大的邏輯中最具體的一個和處理適當可選值:

public HeaderViewModel BuildHeaderViewModel(int? chainId, int? sheetId) 
{ 
    return BuildHeaderViewModel(chainId, sheetId, null); 
} 

public HeaderViewModel BuildHeaderViewModel(int? chainId, int? sheetId, int? fileId) 
{ 
    HeaderViewModel header = new HeaderViewModel(); 

    header.ChainName = db.Chains.Find(chainId).Name; 
    header.SheetName = db.Sheets.Find(sheetId).Name; 
    header.SheetDescription = db.Sheets.Find(sheetId).Description; 

    if(fileId.HasValue) 
    { 
     var fileDetails = db.FileDetails.Find(fileId); 
     header.SheetFileName = fileDetails.Name + fileDetails.Extension; 
    } 
    return header; 
} 

的主要區別是,你當前方法不執行任何不同,如果fileId爲空,這可能是好的,在這種情況下,你可以採取空簽出過載。

+0

我更喜歡這個。謝謝!我將來也會用這種方式。 – justiceorjustus

0

我不認爲從另一個過載版本調用方法有什麼不妥 - 我已經看到它完成了,並且能夠很容易地看到這個意圖。

你基本上說「如果我有fileId,我也想初始化FileDetails對象!」

對我來說很有意義:)