dotnet-core-expert について
APIやサービスを実装する開発者向けの、.NET 8とC# 12の開発スキルです。クリーンアーキテクチャの指針に、ビルド、セキュリティ、テストの手順を組み合わせています。
主な機能
- 01クリーンアーキテクチャ設計の指針
- 02Minimal APIとEF Coreのリファレンス
- 03非同期I/Oと依存性注入の実践
- 04ビルドと統合テストの手順
- 05セキュリティとOpenAPIの指針
活用シーン
- 01レイヤー化した.NETアプリ構成の設計
- 02APIエンドポイントの実装と検証
- 03認証と認可の追加
- 04xUnitとWebApplicationFactoryによるサービスのテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill dotnet-core-expertインストール後、Claude Code で/dotnet-core-expertを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/authentication.mdclean-architecture.mdcloud-native.mdentity-framework.mdminimal-apis.md詳細
.NET Core エキスパート
基本的なワークフロー
- 要件を分析する — アーキテクチャパターン、データモデル、API 設計を特定します
- ソリューションを設計する — 適切に分離されたクリーンアーキテクチャのレイヤーを作成します
- 実装する — 最新の C# 機能を使用して高性能なコードを記述します。
dotnet buildを実行してコンパイルを確認し、ビルドに失敗した場合はエラーを確認して問題を修正し、次へ進む前に再度ビルドします - セキュリティを確保する — 認証、認可、セキュリティのベストプラクティスを追加します
- テストする — xUnit と統合テストを使用して包括的なテストを作成します。
dotnet testを実行してすべてのテストが合格することを確認し、テストに失敗した場合は原因を調査して実装を修正し、続行前に再実行します。curlまたは REST クライアントでエンドポイントを確認します
リファレンスガイド
状況に応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| Minimal API | references/minimal-apis.md | エンドポイント、ルーティング、ミドルウェアの作成時 |
| クリーンアーキテクチャ | references/clean-architecture.md | CQRS、MediatR、レイヤー、DI パターンの使用時 |
| Entity Framework | references/entity-framework.md | DbContext、マイグレーション、リレーションシップの使用時 |
| 認証 | references/authentication.md | JWT、Identity、認可ポリシーの使用時 |
| クラウドネイティブ | references/cloud-native.md | Docker、ヘルスチェック、構成の使用時 |
制約事項
必ず行うこと
- .NET 8 と C# 12 の機能を使用します
.csprojで<Nullable>enable</Nullable>を設定し、null 許容参照型を有効にします- すべての I/O 操作で async/await を使用します — 例:
await dbContext.Users.ToListAsync() - 適切な依存性注入を実装します
- DTO には record 型を使用します — 例:
public record UserDto(int Id, string Name); - クリーンアーキテクチャの原則に従います
WebApplicationFactory<Program>を使用して統合テストを作成します- OpenAPI/Swagger ドキュメントを構成します
絶対に行わないこと
- 同期 I/O 操作を使用する
- API レスポンスでエンティティを直接公開する
- 入力検証を省略する
- 古い .NET Framework のパターンを使用する
- アーキテクチャのレイヤー間で関心事を混在させる
- 非推奨の EF Core パターンを使用する
コード例
Minimal API エンドポイント
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.MapGet("/users/{id}", async (int id, ISender sender, CancellationToken ct) =>
{
var result = await sender.Send(new GetUserQuery(id), ct);
return result is null ? Results.NotFound() : Results.Ok(result);
})
.WithName("GetUser")
.Produces<UserDto>()
.ProducesProblem(404);
app.Run();
MediatR クエリハンドラー
// Application/Users/GetUserQuery.cs
public record GetUserQuery(int Id) : IRequest<UserDto?>;
public sealed class GetUserQueryHandler : IRequestHandler<GetUserQuery, UserDto?>
{
private readonly AppDbContext _db;
public GetUserQueryHandler(AppDbContext db) => _db = db;
public async Task<UserDto?> Handle(GetUserQuery request, CancellationToken ct) =>
await _db.Users
.AsNoTracking()
.Where(u => u.Id == request.Id)
.Select(u => new UserDto(u.Id, u.Name))
.FirstOrDefaultAsync(ct);
}
非同期クエリを使用した EF Core DbContext
// Infrastructure/AppDbContext.cs
public sealed class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
public DbSet<User> Users => Set<User>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
}
}
// Usage in a service
public async Task<IReadOnlyList<UserDto>> GetAllAsync(CancellationToken ct) =>
await _db.Users
.AsNoTracking()
.Select(u => new UserDto(u.Id, u.Name))
.ToListAsync(ct);
Record 型を使用した DTO
public record UserDto(int Id, string Name);
public record CreateUserRequest(string Name, string Email);
出力テンプレート
.NET の機能を実装する際は、次の内容を提示します。
- プロジェクト構成(ソリューション/プロジェクトファイル)
- ドメインモデルと DTO
- API エンドポイントまたはサービスの実装
- 該当する場合はデータベースコンテキストとマイグレーション
- アーキテクチャ上の判断についての簡潔な説明
コメント
Markdown 対応