d48cda4081
CI / Test (ubuntu-latest, Node 18.x, bun) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, npm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, pnpm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, yarn) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 20.x, bun) (push) Failing after 17m13s
CI / Test (ubuntu-latest, Node 20.x, npm) (push) Failing after 18m42s
CI / Test (ubuntu-latest, Node 20.x, pnpm) (push) Failing after 15m0s
CI / Test (ubuntu-latest, Node 20.x, yarn) (push) Failing after 49m44s
CI / Test (ubuntu-latest, Node 22.x, bun) (push) Failing after 51m55s
CI / Test (ubuntu-latest, Node 22.x, pnpm) (push) Failing after 21m57s
CI / Test (ubuntu-latest, Node 22.x, npm) (push) Failing after 37m39s
CI / Test (ubuntu-latest, Node 22.x, yarn) (push) Failing after 34m7s
CI / Validate Components (push) Failing after 37m15s
CI / Python Tests (push) Failing after 10m1s
CI / Security Scan (push) Failing after 10m1s
CI / Lint (push) Failing after 17m12s
CI / Coverage (push) Failing after 20m19s
CI / Test (macos-latest, Node 18.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, yarn) (push) Has been cancelled
51 lines
1.4 KiB
Markdown
51 lines
1.4 KiB
Markdown
---
|
|
paths:
|
|
- "**/*.cs"
|
|
- "**/*.csx"
|
|
---
|
|
# C# Patterns
|
|
|
|
> This file extends [common/patterns.md](../common/patterns.md) with C#-specific content.
|
|
|
|
## API Response Pattern
|
|
|
|
```csharp
|
|
public sealed record ApiResponse<T>(
|
|
bool Success,
|
|
T? Data = default,
|
|
string? Error = null,
|
|
object? Meta = null);
|
|
```
|
|
|
|
## Repository Pattern
|
|
|
|
```csharp
|
|
public interface IRepository<T>
|
|
{
|
|
Task<IReadOnlyList<T>> FindAllAsync(CancellationToken cancellationToken);
|
|
Task<T?> FindByIdAsync(Guid id, CancellationToken cancellationToken);
|
|
Task<T> CreateAsync(T entity, CancellationToken cancellationToken);
|
|
Task<T> UpdateAsync(T entity, CancellationToken cancellationToken);
|
|
Task DeleteAsync(Guid id, CancellationToken cancellationToken);
|
|
}
|
|
```
|
|
|
|
## Options Pattern
|
|
|
|
Use strongly typed options for config instead of reading raw strings throughout the codebase.
|
|
|
|
```csharp
|
|
public sealed class PaymentsOptions
|
|
{
|
|
public const string SectionName = "Payments";
|
|
public required string BaseUrl { get; init; }
|
|
public required string ApiKeySecretName { get; init; }
|
|
}
|
|
```
|
|
|
|
## Dependency Injection
|
|
|
|
- Depend on interfaces at service boundaries
|
|
- Keep constructors focused; if a service needs too many dependencies, split responsibilities
|
|
- Register lifetimes intentionally: singleton for stateless/shared services, scoped for request data, transient for lightweight pure workers
|