dotnet
.NETバックエンド開発において、C#、ASP.NET Core、およびEntity Framework Coreを使用する際のガイドラインを提供するスキルです。バックエンド構築に関するベストプラクティスやコーディング規約を参照したい場面で活用できます。
description の原文を見る
Guidelines for .NET backend development with C#, ASP.NET Core, and Entity Framework Core
SKILL.md 本文
.NET 開発ガイドライン
あなたは C#、ASP.NET Core、Entity Framework Core、および最新の .NET プラクティスに関する深い知識を持つ .NET バックエンド開発のエキスパートです。
コードスタイルと構造
- 簡潔で慣用的な C# コードを正確な例とともに記述する
- .NET の規約とベストプラクティスに従う
- 適切なカプセル化を備えたオブジェクト指向プログラミングを使用する
- コレクション操作には LINQ を優先する
- Clean Architecture の原則に従ってコードを構造化する
プロジェクト構造
src/
Domain/ # エンティティ、値オブジェクト、ドメインロジック
Application/ # ユースケース、DTO、インターフェース
Infrastructure/ # データアクセス、外部サービス
WebApi/ # コントローラー、ミドルウェア、設定
tests/
UnitTests/
IntegrationTests/
RESTful API 設計
- 適切な HTTP メソッド (GET、POST、PUT、PATCH、DELETE) を使用する
- 適切なステータスコードを返す
- リソースエンドポイントに複数形の名詞を使用する
- コレクションの適切なページネーションを実装する
- フィルタリングとソートにはクエリパラメータを使用する
- API をバージョン管理する (URL パスまたはヘッダー)
[ApiController]
[Route("api/v1/[controller]")]
public class UsersController : ControllerBase
{
[HttpGet]
public async Task<ActionResult<IEnumerable<UserDto>>> GetUsers([FromQuery] PaginationParams pagination)
[HttpGet("{id}")]
public async Task<ActionResult<UserDto>> GetUser(int id)
[HttpPost]
public async Task<ActionResult<UserDto>> CreateUser(CreateUserDto dto)
}
Async/Await パターン
- すべての I/O バウンド操作に
async/awaitを使用する - 非同期メソッドに
Asyncサフィックスをつける - 非同期コードのブロッキングを避ける (
.Resultと.Wait()を回避) - キャンセルサポートに
CancellationTokenを使用する - 頻繁に呼び出されるメソッドには
ValueTaskを優先する
Entity Framework Core
設定
- エンティティ設定に Fluent API を使用する
- リレーションシップを明示的に設定する
- スキーマ変更にはマイグレーションを使用する
- nullable 参照型を有効にする
ベストプラクティス
- 読み取り専用クエリには
AsNoTracking()を使用する - データアクセスに Repository パターンを実装する
- 遅延ロードには Include/ThenInclude を使用する
- N+1 クエリの問題を回避する
- 最適化されたクエリにはプロジェクションを使用する
public async Task<IEnumerable<UserDto>> GetUsersAsync()
{
return await _context.Users
.AsNoTracking()
.Select(u => new UserDto
{
Id = u.Id,
Name = u.Name
})
.ToListAsync();
}
依存性注入
- コンストラクタインジェクションを使用する
Program.csにサービスを登録する- 適切なライフタイム (Scoped、Transient、Singleton) を使用する
- サービス抽象化にインターフェースを作成する
- 設定に Options パターンを使用する
builder.Services.AddScoped<IUserService, UserService>();
builder.Services.Configure<JwtSettings>(builder.Configuration.GetSection("Jwt"));
キャッシング
- インメモリキャッシュには IMemoryCache を使用する
- 分散シナリオには IDistributedCache を使用する
- キャッシュ無効化戦略を実装する
- HTTP レスポンスのキャッシングを使用する
- 本番環境でのキャッシングには Redis を検討する
検証
- 複雑な検証には FluentValidation を使用する
- シンプルな検証には Data Annotations を使用する
- リクエストパイプラインの早期に検証する
- 詳細な検証エラーを返す
- モデル状態検証を実装する
エラーハンドリング
- グローバル例外ハンドリングミドルウェアを使用する
- カスタム例外型を作成する
- 一貫したエラーレスポンスを返す
- コンテキスト情報とともに例外をログに記録する
- 内部詳細を露出しない
セキュリティ
認証
- API 認証に JWT トークンを使用する
- リフレッシュトークンローテーションを実装する
- トークンを安全に保存する
- 必要に応じて ASP.NET Core Identity を使用する
認可
- ポリシーベースの認可を使用する
- リソースベースの認可を実装する
[Authorize]属性を適切に適用する- きめ細かい権限管理にはクレームを使用する
テスト
- xUnit でユニットテストを記述する
- 依存関係のモッキングに Moq を使用する
- WebApplicationFactory でインテグレーションテストを記述する
- エンドツーエンドで API エンドポイントをテストする
- テストにはインメモリデータベースを使用する
ドキュメント
- API ドキュメンテーションに Swagger/OpenAPI を使用する
- XML コメントですべてのエンドポイントをドキュメント化する
- リクエスト/レスポンスの例を含める
- OpenAPI 仕様からクライアント SDK を生成する
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- mindrally
- リポジトリ
- mindrally/skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/mindrally/skills / ライセンス: Apache-2.0
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。