Przejdź do treści

TailoredApps.Shared.EntityFramework.UnitOfWork.WebApiCore

NuGet License: MIT


Opis

Integracja Unit of Work z ASP.NET Core Web API — eliminuje boilerplate polegający na ręcznym commicie i rollbacku transakcji w każdym kontrolerze. Biblioteka dostarcza TransactionFilterAttribute — globalny ASP.NET Core action filter, który automatycznie:

  • Otwiera transakcję przed wykonaniem akcji kontrolera
  • Commituje po pomyślnym wykonaniu
  • Rollbackuje w przypadku wyjątku

Opcjonalnie możesz udekorować akcję atrybutem [TransactionIsolationLevel(IsolationLevel.Serializable)], aby ustawić konkretny poziom izolacji dla danego endpointu.


Instalacja

dotnet add package TailoredApps.Shared.EntityFramework.UnitOfWork.WebApiCore

Rejestracja w DI

// Program.cs
using TailoredApps.Shared.EntityFramework.UnitOfWork.WebApiCore;

// 1. Rejestracja UoW + TransactionFilterAttribute
builder.Services
    .AddUnitOfWorkForWebApi<IApplicationDbContext, ApplicationDbContext>();

// 2. Rejestracja jako globalny filter
builder.Services.AddControllers(options =>
{
    options.Filters.AddUnitOfWorkTransactionAttribute();
});

Przykład użycia

Kontroler — transakcja zarządzana automatycznie

[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    private readonly IUnitOfWork<IApplicationDbContext> _uow;

    public OrdersController(IUnitOfWork<IApplicationDbContext> uow)
    {
        _uow = uow;
    }

    [HttpPost]
    public async Task<IActionResult> CreateOrder([FromBody] CreateOrderDto dto)
    {
        // Nie musisz ręcznie commitować — TransactionFilter zrobi to po zakończeniu akcji
        var order = new Order { CustomerId = dto.CustomerId, Amount = dto.Amount };
        _uow.DataProvider.Orders.Add(order);
        await _uow.SaveChangesAsync();

        return CreatedAtAction(nameof(GetOrder), new { id = order.Id }, order);
    }

    // Endpoint z wyższym poziomem izolacji — zapobiega phantom reads
    [HttpPost("transfer")]
    [TransactionIsolationLevel(System.Data.IsolationLevel.Serializable)]
    public async Task<IActionResult> TransferFunds([FromBody] TransferDto dto)
    {
        var from = await _uow.DataProvider.Accounts.FindAsync(dto.FromId);
        var to = await _uow.DataProvider.Accounts.FindAsync(dto.ToId);

        from.Balance -= dto.Amount;
        to.Balance += dto.Amount;

        await _uow.SaveChangesAsync();
        return Ok();
    }
}

Jeśli akcja rzuci wyjątek, TransactionFilterAttribute automatycznie wywoła RollbackTransaction().


API Reference

Typ Rodzaj Opis
TransactionFilterAttribute Action Filter Automatyczne commit/rollback transakcji dla każdej akcji
TransactionIsolationLevelAttribute Atrybut Ustawia poziom izolacji dla konkretnej akcji lub kontrolera
UnitOfWorkConfiguration.AddUnitOfWorkForWebApi<TI, T> Metoda ext. Rejestruje UoW + filter w DI
UnitOfWorkConfiguration.AddUnitOfWorkTransactionAttribute Metoda ext. Dodaje TransactionFilterAttribute jako globalny filter

🤖 AI Agent Prompt

## TailoredApps.Shared.EntityFramework.UnitOfWork.WebApiCore — Instrukcja dla agenta AI

Używasz automatycznego zarządzania transakcjami przez TransactionFilterAttribute w ASP.NET Core.

### Rejestracja
```csharp
// Program.cs
builder.Services.AddUnitOfWorkForWebApi<IMyDbContext, MyDbContext>();
builder.Services.AddControllers(o => o.Filters.AddUnitOfWorkTransactionAttribute());

Zachowanie

  • Każda akcja kontrolera jest automatycznie opakowana w transakcję
  • Sukces → CommitTransaction()
  • Wyjątek → RollbackTransaction()

Poziom izolacji per akcja

[TransactionIsolationLevel(IsolationLevel.Serializable)]
public async Task<IActionResult> CriticalOperation() { ... }

Zasady

  • Nie wywołuj ręcznie CommitTransaction/RollbackTransaction w kontrolerach — filter to robi
  • TransactionIsolationLevelAttribute można stosować na klasie kontrolera lub na metodzie
  • Domyślny poziom izolacji pochodzi z konfiguracji UoW ```