从另一个调用一个重载方法来构建 ViewModel C#/ ASP.NET MVC

Calling one overloaded method from another to build ViewModel C#/ ASP.NET MVC

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

我的问题是,这是执行此操作的正确/最有效的方法吗?如有任何意见,我们将不胜感激。

我认为从它的另一个重载版本调用方法没有任何问题 - 我已经看到它完成了,并且能够很容易地看到意图。

你基本上是在说"If I have the fileId, I'd like to also initialize the FileDetails object, too!"

对我来说很有意义:)

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

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,您的 current 方法没有任何不同,这可能没问题,在这种情况下,您可以进行 null 检查过载。