⚡ AutoSnippets PRO EN

C#: Produkcyjne Snippet'y Kodu

Snippet'y C# / .NET: EF Core, middleware, background services, cachowanie.

Python JavaScript TypeScript Java C# C++ Go PHP Rust SQL

Na tej stronie:

21. C#: Generic Repository (EF Core)

C#

Uniwersalna warstwa dostępu do danych z obsługą asynchroniczną.

public class Repository where T : class {
    private readonly DbContext _context;
    private readonly DbSet _dbSet;

    public Repository(DbContext context) {
        _context = context;
        _dbSet = context.Set();
    }

    public async Task GetByIdAsync(int id) => await _dbSet.FindAsync(id);
}

Kiedy używać

Przydatne, gdy wiele encji w bazie danych wymaga tych samych podstawowych operacji CRUD.

Typowe pułapki

Zbyt ogólne repozytorium utrudnia dodawanie specyficznych zapytań z Include() czy złożonych filtrów — czasem lepiej wydzielić repozytoria dziedziczące.

22. C#: Global Exception Middleware

C#

Przechwytywanie błędów w ASP.NET Core i zwracanie JSON.

public class ExceptionMiddleware {
    private readonly RequestDelegate _next;
    public ExceptionMiddleware(RequestDelegate next) => _next = next;

    public async Task InvokeAsync(HttpContext context) {
        try { await _next(context); }
        catch (Exception ex) {
            context.Response.StatusCode = 500;
            await context.Response.WriteAsJsonAsync(new { error = ex.Message });
        }
    }
}

Kiedy używać

Warto dodać do każdej aplikacji ASP.NET Core, żeby mieć spójny format błędów API zamiast domyślnych stron błędów .NET.

Typowe pułapki

Zwracanie ex.Message bezpośrednio do klienta może ujawnić szczegóły implementacji — w produkcji lepiej logować pełny błąd, a klientowi zwracać ogólny komunikat.

23. C#: Background Hosted Service

C#

Długodziałający proces w tle wykonujący cykliczne zadania systemowe.

public class TimedWorker : BackgroundService {
    protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
        while (!stoppingToken.IsCancellationRequested) {
            await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
        }
    }
}

Kiedy używać

Idealne do zadań cyklicznych działających w tle całej aplikacji, np. czyszczenie cache, wysyłka raportów, odpytywanie zewnętrznego API.

Typowe pułapki

Nieobsłużony wyjątek wewnątrz ExecuteAsync może zatrzymać całą usługę w tle bez wyraźnego powiadomienia — dodaj obsługę błędów wewnątrz pętli.

24. C#: Wstrzykiwanie Opcji Konfiguracyjnych

C#

Konfiguracja silnie typowanych ustawień aplikacji w .NET.

public class SmtpSettings {
    public string Host { get; set; } = string.Empty;
    public int Port { get; set; }
}

// Rejestracja: builder.Services.Configure(builder.Configuration.GetSection("Smtp"));

Kiedy używać

Stosuj zamiast czytania appsettings.json ręcznie — daje silne typowanie i łatwiejsze testowanie konfiguracji.

Typowe pułapki

Zmiana wartości w appsettings.json w runtime nie zaktualizuje się automatycznie, chyba że użyjesz IOptionsMonitor zamiast IOptions.

25. C#: Cachowanie z Ochroną przed Stampede

C#

Pobieranie danych z mechanizmem blokady zapobiegającym przeciążeniom.

using Microsoft.Extensions.Caching.Memory;

public class CachedService {
    private readonly IMemoryCache _cache;
    public async Task GetDataAsync(string key) {
        return await _cache.GetOrCreateAsync(key, async entry => {
            entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5);
            return await FetchFromDatabaseAsync();
        });
    }
    private Task FetchFromDatabaseAsync() => Task.FromResult("Dane");
}

Kiedy używać

Przydatne przy kosztownych operacjach (zapytania do bazy, wywołania zewnętrznego API), o które pyta wielu użytkowników naraz.

Typowe pułapki

Bez blokady (jak w GetOrCreateAsync) wygaśnięcie cache może wywołać dziesiątki równoległych zapytań do źródła danych w tym samym momencie — tzw. cache stampede.