У меня есть простой метод настройки, чтобы создать запись и, если она прошла успешно, вернуть созданную запись. Если это не так, верните ValidationError.
public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry)
Это прекрасно работает, если запись была действительной. Но я хочу вернуть ValidationError, если проверка не удалась.
Я пытался сделать это:
public async Task<MyNewEntry | ValidationError> CreateEntry(MyUser user, MyEntryRequest entry)
Но тогда это не компилируется. Как мне сконструировать этот метод так, чтобы он мог возвращать либо MyNewEntry
либо ValidationError
Для этого вы можете использовать Result-Type, который состоит из свойства "bool Success" и Error, а также свойства Entry, значение которого всегда только одно заполняется значением, в зависимости от успеха вашего метода.
public class CreateEntryResult
{
public bool Success {get;set;}
public MyNewEntry Entry {get;set;}
public ValdidationError Error {get;set;}
}
Чтобы сэкономить память (вы можете создать дополнительный объект для каждого результата), вы также можете вернуть структуру. Просто замените ключевое слово "class" в моем коде на "struct". Содержащиеся ссылки затем будут переданы в виде значений, и вам не придется думать о каком-либо влиянии на сборку мусора.
Другим способом сделать это, которого я не видел в последние годы, является шаблон "Try", в котором вы возвращаете тип результата (обычно bool) и используете out-параметры для возврата ваших значений. Я не уверен, как out-параметры работают вместе с async.
bool TryCreateEntry(..., out MyNewEntry entry, out ValidationError error)