Я играю с 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
напрямую и использовать вместо этого, как мне этого добиться?