Как использовать language-ext функторы либо для обработки ошибок в API репозитория? - PullRequest
0 голосов
/ 22 февраля 2019

Я играю с language-ext библиотекой, которая включает в себя функциональные шаблоны для C # (и его меньший sibling csharp-monad ), и я хотел бы применить некоторые шаблоны киметь дело с ошибками в приложении ASP.NET Core.

В моих приложениях у меня часто бывают следующие слои:

  • Действия ASP.NET (поверхность REST API) Уровень
  • Уровень службы домена
  • Уровень / хранилище постоянства
  • Уровень базы данных

Пример упрощенного кода:

[Route("api/v1/[controller]")]
public class FlightsController : Controller
{
    private readonly IFlightService _flightService;
    private readonly IDistanceCalculator _distanceCalculator;

    // [...]

    public FlightsController(IFlightService flightService, IDistanceCalculator distanceCalculator)
    {
        _flightService = flightService;
        _distanceCalculator = distanceCalculator;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var result = _flightService.GetFlights();

        switch (result)
        {
            case Success<List<FlightDTO>> success:
                var flights = new List<FlightInformations>();
                success.Value.ForEach(x => flights.Add(new FlightInformations(x)));
                return Ok(flights);
            case Failure<List<FlightDTO>> failure:
                return StatusCode((int) HttpStatusCode.InternalServerError, failure.Errors);
            default:
                return StatusCode((int) HttpStatusCode.InternalServerError, "Unexpected error");
        }
    }
}

public class FlightService : IFlightService
{
    private readonly IFlightRepository _flightRepository;

    public FlightService(IFlightRepository flightRepository)
    {
        _flightRepository = flightRepository;
    }

    // [...]

    public Result<List<FlightDTO>> GetFlights()
    {
        var res = _flightRepository.SelectFlights();
        switch (res)
        {
            case Success<List<Flight>> success:
                var flights = new List<FlightDTO>();
                success.Value.ForEach(x => flights.Add(new FlightDTO(x)));
                return Result<List<FlightDTO>>.Ok(flights);
            case Failure<List<Flight>> failure:
                return Result<List<FlightDTO>>.Fail(failure.Errors);
            default:
                return Result<List<FlightDTO>>.Fail(new List<string>() {"An error occured"});
        }
    }
}

public class FlightRepository : IFlightRepository
{
    private readonly FlightManagerDbContext _context;

    public FlightRepository(FlightManagerDbContext context)
    {
        _context = context;
    }

    // [...]

    public Result<List<Flight>> SelectFlights()
    {
        try
        {
            return Result<List<Flight>>.Ok(_context.Flight.Any()
                ? _context.Flight.ToList()
                : new List<Flight>());
        }
        catch (Exception e)
        {
            return Result<List<Flight>>.Fail(new List<string>() {$"An error occured,{e.Message}"});
        }
    }
}

Я быхотелось бы избегать использования try / catch напрямую и использовать вместо этого, как мне этого добиться?

...