2016-11-08 82 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对象!”

对我来说很有意义:)