Необходима проверка работоспособности в отношении пользовательского возвращаемого объекта типа «Задача» - PullRequest
0 голосов
/ 13 февраля 2020

Я создал структуру Outcome, чтобы я мог возвращать либо успешный результат, либо сообщение об ошибке из любого метода в моих хранилищах данных (реализация этого не относится к вопросу, кроме конструкторов, которые получают либо TResult для успеха, либо Exception для отказа).

Каждый раз, когда я использую это, как и для доступа к базе данных, я запускаю его, используя async / await Таким образом, подпись вызова БД будет выглядеть примерно так: public async Task<Outcome<PersonModel>> GetPerson(PersonID personID);

Я пытался выяснить, могу ли я использовать пользовательский объект типа «Задача» (например, AsyncOutcome<TResult>) для переноса Outcome<TResult> без необходимости использования двухуровневых генериков. Например:

public async AsyncOutcome<PersonModel> GetPerson(PersonID personID)
{
    try
    {
        PersonModel model = /* get person from the database */
        return new AsyncOutcome<PersonModel>(model);
    }
    catch (Exception ex)
    {
        return new AsyncOutcome<PersonModel>(ex);
    }
}
public async Task TestAction
{
    Outcome<PersonModel> result = await GetPerson(new PersonID(1234));

    Console.WriteLine(result.ToString());
}

Однако я пытался обернуть голову вокруг ограниченной документации, касающейся объектов типа «Задача», и AsyncMethodBuilder, и я просто не могу понять, как это сделать.

Возможно ли это (без переписывания всего конечного автомата и т. Д. c.) Или я скрываюсь ни к чему?

Кто-нибудь делал что-то подобное раньше?

...