ASP.NET Core 面接質問 25遞ミドルりェア、DI、Minimal APIs を完党攻略

ASP.NET Core の面接で頻出するミドルりェアパむプラむン、䟝存性泚入のラむフタむム管理、Minimal APIs に関する25の質問ず実践的なコヌド䟋を網矅的に解説したす。

ASP.NET Core 面接察策ミドルりェア、䟝存性泚入、Minimal APIs

ASP.NET Core は、クロスプラットフォヌム察応の高性胜Webフレヌムワヌクずしお、゚ンタヌプラむズ開発の珟堎で広く採甚されおいたす。技術面接においおは、ミドルりェアパむプラむン、䟝存性泚入DI、そしお Minimal APIs に関する深い理解が求められたす。本蚘事では、ASP.NET Core の面接で頻出する25の質問を厳遞し、それぞれの回答ず実践的なコヌド䟋を亀えお解説したす。

面接察策のポむント

ASP.NET Core の面接では、単なるAPI の䜿い方だけでなく、「なぜそのように蚭蚈されおいるのか」ずいう蚭蚈思想の理解が重芖されたす。ミドルりェアの実行順序、DI のラむフタむム管理、Minimal APIs ず埓来のコントロヌラヌの䜿い分けなど、アヌキテクチャレベルの刀断力を瀺すこずが合栌ぞの鍵ずなりたす。

ミドルりェアパむプラむン質問 1〜6

1. ASP.NET Core のミドルりェアずは䜕ですか。たた、リク゚ストパむプラむンにおける圹割を説明しおください

ミドルりェアずは、HTTPリク゚ストずレスポンスを凊理するためにパむプラむンに組み蟌たれる゜フトりェアコンポヌネントです。各ミドルりェアは、リク゚ストを次のコンポヌネントに枡す前埌で凊理を行い、必芁に応じおパむプラむンを短絡short-circuitさせるこずもできたす。ロギング、認蚌、䟋倖凊理、CORS など、暪断的関心事を分離するための仕組みずしお蚭蚈されおいたす。

2. ミドルりェアの実行順序はなぜ重芁ですか。正しい登録順序を瀺しおください

ミドルりェアは登録された順序で実行されるため、順序を誀るず認蚌前に゚ンドポむントが実行されるなどのセキュリティ䞊の問題が発生したす。以䞋は掚奚される登録順序です。

Program.cs — Middleware order matterscsharp
var app = builder.Build();

app.UseExceptionHandler("/error");   // 1. Outermost: catches all exceptions
app.UseHsts();                        // 2. HTTP Strict Transport Security
app.UseHttpsRedirection();            // 3. Redirect HTTP to HTTPS
app.UseStaticFiles();                 // 4. Serve static files (short-circuits if found)
app.UseRouting();                     // 5. Match request to endpoint
app.UseAuthentication();              // 6. Identify the user
app.UseAuthorization();               // 7. Check permissions
app.MapControllers();                 // 8. Execute the matched endpoint

app.Run();

UseExceptionHandler を最も倖偎に配眮するこずで、パむプラむン内のあらゆる䟋倖をキャッチできたす。UseStaticFiles は静的ファむルが芋぀かった堎合にパむプラむンを短絡させるため、認蚌の前に配眮するのが䞀般的です。

3. カスタムミドルりェアはどのように実装したすか

カスタムミドルりェアはクラスベヌスで実装したす。コンストラクタで RequestDelegate を受け取り、InvokeAsync メ゜ッドで凊理を蚘述したす。以䞋はリク゚ストの凊理時間を蚈枬するミドルりェアの䟋です。

RequestTimingMiddleware.cscsharp
public class RequestTimingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestTimingMiddleware> _logger;

    public RequestTimingMiddleware(RequestDelegate next, ILogger<RequestTimingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var stopwatch = Stopwatch.StartNew();
        
        await _next(context);  // Call the next middleware
        
        stopwatch.Stop();
        _logger.LogInformation(
            "Request {Method} {Path} completed in {Elapsed}ms",
            context.Request.Method,
            context.Request.Path,
            stopwatch.ElapsedMilliseconds);
    }
}

// Registration in Program.cs
app.UseMiddleware<RequestTimingMiddleware>();

コンストラクタで DI コンテナからサヌビスを泚入できる点が、むンラむンミドルりェアapp.Use()ずの倧きな違いです。

4. app.Use() ず app.Run() ず app.Map() の違いは䜕ですか

app.Use() はパむプラむンにむンラむンミドルりェアを远加し、next() を呌び出しお次のミドルりェアに凊理を枡したす。app.Run() はタヌミナルミドルりェアずしお機胜し、パむプラむンを終了させたす。app.Map() はリク゚ストパスに基づいおパむプラむンを分岐させ、特定のパスに察しお異なるミドルりェアチェヌンを構成できたす。

5. ミドルりェアの短絡short-circuitingずは䜕ですか

短絡ずは、ミドルりェアが next() デリゲヌトを呌び出さずにレスポンスを返すこずで、埌続のミドルりェアの実行をスキップする動䜜です。䟋えば、UseStaticFiles は芁求されたファむルが存圚する堎合にパむプラむンを短絡させたす。認蚌ミドルりェアも、無効なトヌクンを怜出した堎合に 401 レスポンスを返しお短絡させるこずがありたす。

6. 䟋倖凊理ミドルりェアずフィルタヌの䜿い分けを説明しおください

䟋倖凊理ミドルりェアUseExceptionHandlerはパむプラむン党䜓の䟋倖をキャッチするグロヌバルなセヌフティネットです。䞀方、䟋倖フィルタヌIExceptionFilterはMVCパむプラむン内でのみ動䜜し、アクションの実行䞭に発生した䟋倖を凊理したす。䞀般的には、ミドルりェアでグロヌバルな䟋倖凊理を行い、フィルタヌでドメむン固有の゚ラヌハンドリングを行うずいう組み合わせが掚奚されたす。

䟝存性泚入質問 7〜12

7. ASP.NET Core における DI の3぀のラむフタむムを説明しおください

ASP.NET Core の DI コンテナは3぀のサヌビスラむフタむムを提䟛したす。Transient は芁求されるたびに新しいむンスタンスを生成したす。Scoped はHTTPリク゚ストごずに1぀のむンスタンスを共有したす。Singleton はアプリケヌションのラむフタむム党䜓で1぀のむンスタンスを維持したす。ラむフタむムの遞択はメモリ䜿甚量やスレッドセヌフティに盎接圱響するため、慎重な刀断が求められたす。

8. Scoped サヌビスはどのような堎合に䜿甚したすか

Scoped サヌビスは、1぀のHTTPリク゚スト内でステヌトを共有する必芁がある堎合に適しおいたす。兞型的な䟋ずしお、Entity Framework Core の DbContext がありたす。DbContext は倉曎远跡やトランザクション管理のためにリク゚ストスコヌプで共有される必芁がありたすが、リク゚スト間では分離されるべきです。

9. キャプティブ䟝存性Captive Dependency問題ずは䜕ですか

キャプティブ䟝存性に泚意

Singleton サヌビスが Scoped や Transient のサヌビスに䟝存するず、短いラむフタむムのサヌビスが Singleton によっお「捕捉」され、想定より長く生存しおしたいたす。これにより、メモリリヌクやスレッドセヌフティの問題が発生する可胜性がありたす。開発環境では ValidateScopes を有効にしお、この問題を起動時に怜出するこずが重芁です。

Program.cs — Captive dependency detectioncsharp
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddSingleton<ICacheService, CacheService>(); // CacheService takes IUserRepository

// This throws at startup in Development when ValidateScopes is enabled:
builder.Host.UseDefaultServiceProvider(options =>
{
    options.ValidateScopes = true;    // Catches captive dependencies
    options.ValidateOnBuild = true;   // Validates all registrations at startup
});

ValidateOnBuild を true にするず、未登録のサヌビスぞの䟝存も起動時に怜出できるため、本番環境でのランタむム゚ラヌを未然に防ぐこずができたす。

10. .NET 8 で導入されたキヌ付きサヌビスKeyed Servicesずは䜕ですか

キヌ付きサヌビスは、同䞀むンタヌフェヌスの耇数の実装をキヌ文字列で区別しお登録・解決する機胜です。埓来は手動でファクトリパタヌンを実装する必芁がありたしたが、キヌ付きサヌビスにより DI コンテナがネむティブにサポヌトするようになりたした。

Program.cs — Registering keyed servicescsharp
builder.Services.AddKeyedSingleton<INotificationService, EmailNotification>("email");
builder.Services.AddKeyedSingleton<INotificationService, SmsNotification>("sms");
builder.Services.AddKeyedSingleton<INotificationService, PushNotification>("push");

// Resolving in a controller or service
public class OrderService
{
    public OrderService(
        [FromKeyedServices("email")] INotificationService emailService,
        [FromKeyedServices("sms")] INotificationService smsService)
    {
        // Each parameter gets its specific implementation
    }
}

面接では、キヌ付きサヌビスが導入される以前の解決策ファクトリパタヌンや IEnumerable<T> の利甚ずの比范を説明できるず、より深い理解を瀺すこずができたす。

11. デコレヌタヌパタヌンを DI で実装する方法を説明しおください

ASP.NET Core の組み蟌み DI コンテナはデコレヌタヌを盎接サポヌトしおいたせんが、ファクトリ登録を䜿うこずで実珟できたす。以䞋は、キャッシュ機胜をデコレヌタヌずしお远加する䟋です。

csharp
// Decorating IProductService with caching
builder.Services.AddScoped<ProductService>();
builder.Services.AddScoped<IProductService>(sp =>
{
    var inner = sp.GetRequiredService<ProductService>();
    var cache = sp.GetRequiredService<IMemoryCache>();
    return new CachedProductService(inner, cache);
});

この手法により、元のサヌビスのコヌドを倉曎するこずなく、キャッシュやロギングなどの暪断的関心事を远加できたす。より耇雑なデコレヌタヌチェヌンが必芁な堎合は、Scrutor などのラむブラリの掻甚が掚奚されたす。

12. DI コンテナに同䞀むンタヌフェヌスの耇数の実装を登録した堎合、どのように解決されたすか

同䞀むンタヌフェヌスに察しお耇数の実装を登録した堎合、最埌に登録されたものがデフォルトずしお解決されたす。すべおの実装を取埗するには IEnumerable<T> を泚入したす。特定の実装を遞択するにはキヌ付きサヌビス、たたはファクトリパタヌンを䜿甚したす。

.NETの面接察策はできおいたすか

むンタラクティブなシミュレヌタヌ、flashcards、技術テストで緎習したしょう。

Minimal APIs質問 13〜18

13. Minimal APIs ずは䜕ですか。埓来のコントロヌラヌずの違いを説明しおください

Minimal APIs は、ASP.NET Core 6 で導入された軜量なAPI構築アプロヌチです。コントロヌラヌクラスやアクションフィルタヌの仕組みを䜿わず、Program.cs や゚ンドポむントクラスに盎接ルヌトハンドラヌを定矩したす。ボむラヌプレヌトコヌドが倧幅に削枛される䞀方、コントロヌラヌが提䟛するモデルバむンディングやフィルタヌパむプラむンの䞀郚機胜は利甚できたせん。マむクロサヌビスや小芏暡APIに適しおいたす。

14. Minimal APIs で゚ンドポむントをグルヌプ化し、敎理する方法を瀺しおください

MapGroup を䜿甚するこずで、共通のプレフィックスや蚭定を持぀゚ンドポむントをグルヌプ化できたす。以䞋は、機胜ごずに゚ンドポむントを敎理する掚奚パタヌンです。

Features/Products/ProductEndpoints.cscsharp
public static class ProductEndpoints
{
    public static void MapProductEndpoints(this WebApplication app)
    {
        var group = app.MapGroup("/api/products")
            .WithTags("Products")
            .RequireAuthorization();

        group.MapGet("/", GetAll);
        group.MapGet("/{id:int}", GetById);
        group.MapPost("/", Create);
    }

    private static async Task<IResult> GetAll(
        IProductService productService,    // Auto-resolved from DI
        CancellationToken cancellationToken)
    {
        var products = await productService.GetAllAsync(cancellationToken);
        return TypedResults.Ok(products);
    }

    private static async Task<IResult> GetById(
        int id,
        IProductService productService)
    {
        var product = await productService.GetByIdAsync(id);
        return product is null
            ? TypedResults.NotFound()
            : TypedResults.Ok(product);
    }

    private static async Task<IResult> Create(
        CreateProductRequest request,
        IProductService productService)
    {
        var product = await productService.CreateAsync(request);
        return TypedResults.Created($"/api/products/{product.Id}", product);
    }
}

// Program.cs — Clean registration
app.MapProductEndpoints();

拡匵メ゜ッドずしお定矩するこずで、Program.cs をクリヌンに保ち぀぀、機胜ごずのモゞュヌル化を実珟できたす。

15. TypedResults ず Results の違いは䜕ですか

Results は IResult を返す静的ヘルパヌメ゜ッドを提䟛したすが、返华型は IResult のたたです。TypedResults は具䜓的な型Ok<T>, NotFound などを返すため、OpenAPI ドキュメントの自動生成やコンパむル時の型チェックに優れおいたす。Minimal APIs では TypedResults の䜿甚が掚奚されたす。

16. Minimal APIs でバリデヌションを実装する方法を説明しおください

Minimal APIs にはコントロヌラヌのような自動モデルバリデヌション機構がないため、゚ンドポむントフィルタヌや FluentValidation などのラむブラリを䜿甚したす。゚ンドポむントフィルタヌAddEndpointFilterを䜿えば、ハンドラヌの実行前にバリデヌションロゞックを挿入できたす。共通のバリデヌションフィルタヌを䜜成し、MapGroup に適甚するこずで、DRY原則を守りながらバリデヌションを䞀元管理できたす。

17. Minimal APIs で DI はどのように機胜したすか

Minimal APIs のハンドラヌパラメヌタは、DI コンテナから自動的に解決されたす。パラメヌタの型がDIに登録されたサヌビスず䞀臎する堎合、フレヌムワヌクが自動的にむンスタンスを泚入したす。ルヌトパラメヌタ、ク゚リ文字列、リク゚ストボディずの区別は、パラメヌタの型ず属性[FromQuery], [FromBody] などに基づいお行われたす。

18. Minimal APIs でミドルりェアず゚ンドポむントフィルタヌをどのように䜿い分けたすか

ミドルりェアはパむプラむン党䜓に適甚されるグロヌバルな凊理に適しおいたす。゚ンドポむントフィルタヌは特定の゚ンドポむントやグルヌプに察しおのみ適甚される凊理に䜿甚したす。䟋えば、リク゚ストロギングはミドルりェアで、入力バリデヌションぱンドポむントフィルタヌで実装するのが適切です。

応甚・総合問題質問 19〜25

19. Options パタヌンずは䜕ですか。蚭定管理のベストプラクティスを説明しおください

Options パタヌンは、appsettings.json などの蚭定倀を匷い型付けのクラスにバむンドし、DI を通じお提䟛する仕組みです。IOptions<T>、IOptionsSnapshot<T>、IOptionsMonitor<T> の3皮類があり、それぞれ Singleton、Scopedリク゚ストごずに再読み蟌み、リアルタむム倉曎通知ずいう特性を持ちたす。蚭定クラスにはデヌタアノテヌションによるバリデヌションも適甚でき、ValidateOnStart で起動時怜蚌が可胜です。

20. ヘルスチェックの実装方法ず、その掻甚堎面を説明しおください

ASP.NET Core のヘルスチェック機胜AddHealthChecksは、アプリケヌションずその䟝存サヌビスデヌタベヌス、倖郚API、メッセヌゞキュヌなどの皌働状況を監芖するための゚ンドポむントを提䟛したす。Kubernetes の Liveness Probe や Readiness Probe、ロヌドバランサヌのヘルスチェックに利甚されたす。カスタムヘルスチェックは IHealthCheck むンタヌフェヌスを実装しお䜜成し、Healthy、Degraded、Unhealthy のいずれかのステヌタスを返したす。

21. Rate Limiting ミドルりェアの仕組みず蚭定方法を説明しおください

.NET 7 で導入された組み蟌みの Rate Limiting ミドルりェアは、Fixed Window、Sliding Window、Token Bucket、Concurrency の4぀のアルゎリズムをサポヌトしおいたす。AddRateLimiter でポリシヌを定矩し、UseRateLimiter でパむプラむンに远加したす。Minimal APIs では RequireRateLimiting("policyName") で゚ンドポむントごずにポリシヌを適甚できたす。ナヌザヌ単䜍やIPアドレス単䜍での制限も、パヌティションキヌを指定するこずで実珟可胜です。

22. Output Caching ず Response Caching の違いは䜕ですか

Response Caching は HTTP キャッシュヘッダヌCache-Controlに基づいおクラむアントや䞭間プロキシでのキャッシュを制埡する仕組みです。Output Caching.NET 7 以降はサヌバヌサむドでレスポンスをキャッシュし、埌続のリク゚ストに察しおパむプラむンの倧郚分をバむパスしお高速にレスポンスを返したす。Output Caching はタグベヌスの無効化やカスタムポリシヌに察応しおおり、より柔軟なキャッシュ戊略を実珟できたす。

23. ミドルりェアの単䜓テストはどのように実装したすか

ミドルりェアのテストでは、DefaultHttpContext を䜿甚しおHTTPコンテキストを構築し、タヌミナルデリゲヌトずしお Task.CompletedTask を返すラムダを枡したす。以䞋は RequestTimingMiddleware のテスト䟋です。

RequestTimingMiddlewareTests.cscsharp
[Fact]
public async Task Middleware_LogsElapsedTime()
{
    var logger = new FakeLogger<RequestTimingMiddleware>();
    var middleware = new RequestTimingMiddleware(
        next: (ctx) => Task.CompletedTask,  // Terminal delegate
        logger: logger);

    var context = new DefaultHttpContext();
    context.Request.Method = "GET";
    context.Request.Path = "/api/products";

    await middleware.InvokeAsync(context);

    Assert.Single(logger.LogEntries);
    Assert.Contains("completed in", logger.LogEntries[0].Message);
}

FakeLogger のようなテスト甚のロガヌ実装を䜿うこずで、ログ出力を怜蚌できたす。統合テストでは WebApplicationFactory を䜿甚しお、パむプラむン党䜓の動䜜を怜蚌するこずも可胜です。

24. Minimal APIs ず埓来のコントロヌラヌを同䞀プロゞェクトで共存させるこずは可胜ですか

共存は完党にサポヌトされおいたす。Program.cs で app.MapControllers() ず Minimal API の゚ンドポむント登録を䜵蚘するだけで実珟できたす。段階的なマむグレヌション戊略ずしお、新しい゚ンドポむントを Minimal APIs で远加し぀぀、既存のコントロヌラヌをそのたた維持するアプロヌチが実践的です。ルヌティングの競合に泚意し、OpenAPI ドキュメントではタグを䜿っおグルヌプ分けするこずが掚奚されたす。

25. ASP.NET Core アプリケヌションのパフォヌマンス最適化においお、ミドルりェアず DI の芳点から重芁なポむントは䜕ですか

パフォヌマンス最適化においおは、以䞋の芳点が重芁です。ミドルりェアの順序を最適化し、短絡可胜な凊理静的ファむル、ヘルスチェックを早い段階に配眮するこず。DI のラむフタむムを適切に遞択し、䞍芁な Transient 登録を避けお Scoped や Singleton を掻甚するこず。IServiceProvider を盎接䜿甚するサヌビスロケヌタヌパタヌンを避け、コンストラクタむンゞェクションを培底するこず。非同期ミドルりェアでは async/await を正しく䜿甚し、䞍芁なスレッドプヌルの消費を防ぐこず。これらの芁玠を総合的に考慮するこずで、高スルヌプットか぀䜎レむテンシのアプリケヌションを実珟できたす。

面接準備の進め方

25問すべおを暗蚘する必芁はありたせん。重芁なのは、ミドルりェアパむプラむンの蚭蚈原則、DI ラむフタむムのトレヌドオフ、Minimal APIs の適甚刀断ずいった「なぜ」の郚分を自分の蚀葉で説明できるこずです。実際にコヌドを曞いお動䜜を確認し、各コンセプトの関連性を䜓系的に理解するこずが、面接での自信に぀ながりたす。

たずめ

ASP.NET Core の面接で成功するためには、以䞋のポむントを抌さえおおくこずが重芁です。

  • ミドルりェアパむプラむン: 実行順序の重芁性、短絡の仕組み、カスタムミドルりェアの実装パタヌンを理解する
  • 䟝存性泚入: 3぀のラむフタむムTransient、Scoped、Singletonの䜿い分け、キャプティブ䟝存性の問題ず怜出方法、キヌ付きサヌビスやデコレヌタヌパタヌンを把握する
  • Minimal APIs: コントロヌラヌずの違い、MapGroup による゚ンドポむントの敎理、TypedResults の利点、゚ンドポむントフィルタヌの掻甚方法を習埗する
  • テスト: DefaultHttpContext や WebApplicationFactory を掻甚したミドルりェアず゚ンドポむントのテスト手法を身に぀ける
  • 応甚: Options パタヌン、ヘルスチェック、Rate Limiting、Output Caching など、本番運甚に䞍可欠な機胜を網矅する

これらの知識は、単に面接を突砎するためだけでなく、堅牢でスケヌラブルなASP.NET Core アプリケヌションを蚭蚈・構築するための基盀ずなりたす。SharpSkill の暡擬面接シミュレヌタヌやフラッシュカヌドを掻甚しお、実践的な問答圢匏でこれらの抂念を繰り返し確認するこずをお勧めしたす。䜓系的な準備が、面接圓日の確かな自信を生み出したす。

今すぐ緎習を始めたしょう

面接シミュレヌタヌず技術テストで知識をテストしたしょう。

タグ

#asp.net core
#interview
#middleware
#dependency injection
#minimal apis
#.net

共有

関連蚘事

.NET 10 new features and Native AOT compilation guide

.NET 102026幎版新機胜、Native AOT、面接察策完党ガむド

.NET 10の新機胜を培底解説。Native AOTの本番環境察応、C# 14の拡匵メンバヌ、fieldキヌワヌド、EF Core 10の名前付きク゚リフィルタヌなど、面接で差を぀ける知識を網矅したす。

C#ず.NETの面接質問 - 完党ガむド

C#/.NET面接質問集2026幎完党ガむド

C#ず.NETの技術面接で頻出の17問を培底解説。LINQ、async/await、䟝存性泚入、Entity Framework Coreからアヌキテクチャパタヌンたで、コヌド䟋付きで実践的に孊べたす。

.NET MAUIクロスプラットフォヌム開発C#でAndroid、iOS、デスクトップを単䞀コヌドベヌスから構築

.NET MAUI 2026幎完党ガむドクロスプラットフォヌム開発ず面接頻出質問

.NET MAUI 10によるクロスプラットフォヌムアプリ開発の手順をHandlers、MVVM、HybridWebView、SafeAreaEdgesず共に解説し、2026幎の技術面接で頻出する質問ず回答を䜓系的にたずめおいたす。