从一个重载方法调用另一个重载方法来构建ViewModel.净MVC

本文关键字:重载 方法 构建 ViewModel MVC 另一个 调用 一个 | 更新日期: 2023-09-27 18:17:02

对ASP半生不熟。NET MVC和编程。我有一个方法,它建立了一个ViewModel,我在大多数其他视图中使用,并有两个重载。我想从第二个重载调用第一个重载以提高效率,所以我这样做:

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;
}

我的问题是,这是正确/最有效的方法吗?

从一个重载方法调用另一个重载方法来构建ViewModel.净MVC

实际上,使用链重载的典型的方法是将大部分逻辑放在最具体的逻辑中,并适当地处理可选值:

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为null, 当前方法没有什么不同,这可能是可以的,在这种情况下,您可以将null检查从过载中取出。

我不认为从它的另一个重载版本调用一个方法有什么错——我见过这样做,并且能够很容易地看出意图。

你基本上是在说"如果我有fileId,我也想初始化FileDetails对象!"

对我来说是有意义的