Skip to content

Instantly share code, notes, and snippets.

@IEvangelist
Last active May 16, 2018 11:25
Show Gist options
  • Save IEvangelist/580fbc0da082bfd31f63a9dbd201acab to your computer and use it in GitHub Desktop.
Save IEvangelist/580fbc0da082bfd31f63a9dbd201acab to your computer and use it in GitHub Desktop.

Tuple Extensions

public static class TupleExtensions {
    public static async Task<T> TryAwaitOrLogAsync<T>(
        this (Task<T> task, ILogger logger) t,
        T defaultValue = default) {
        try {
            var result = await t.task;
            return result == default ? defaultValue : result;
        }
        catch (Exception ex) {
            if (t.logger != null) {
                t.logger.LogError(ex, ex.Message);
            }

            return defaultValue;
        }
    }
}

Consuming It

public class InputOutputBoundRepository<T> : IIOBoundRepository<T> where T : IRecord {
    
    private readonly IDataAccessLayer _iDal;
    private readonly ILogger<InputOutputBoundRepository<IRecord>> _logger;
    
    public InputOutputBoundRepository(
        IDataAccessLayer iDal,
        ILogger<InputOutputBoundRepository<IRecord>> logger) {
        _iDal = iDal ?? throw new ArgumentNullException(nameof(iDal));
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }
    
    // Avoid the `async` and `await` keyword here
    // Single line expression
    // Generic
    // Task based async
    // Encapsulates try / catch
    // Handles logging
    // Allows for default override
    public Task<IEnumerable<T>> GetAsync(Func<T, bool> predicate)
        => (task: _iDal.GetRecordsWhereAsync(predicate), _logger).TryAwaitOrLogAsync(Enumerable.Empty<T>());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment