.NET/C# インタビューの質問まとめシリーズ: ASP.NET Core のトピック

1. コントローラーにサービスを注入するにはどうすればよいですか?

このサービスは config services メソッドで構成します。そして、コントローラーのコンストラクターに、この依存関係の注入を追加します。

2. DDD についてのあなたの理解について話してください。

DDD、ドメイン駆動設計。これはソフトウェア設計をドメインを通じて導くものであり、非常に抽象的なソフトウェア設計の考え方であり、主に戦略的設計と戦術的設計に分けられます。
戦略の観点からは、イベント ストームを通じてドメイン モデルを分割し、コア ドメイン、サブドメイン、サポート ドメインを分割し、共通言語を定義し、境界コンテキストを分割します。
戦術設計の観点から言えば、dddはアーキテクチャを階層化し、「疎結合、高凝集性」がアーキテクチャ設計の全体的な考え方となります。DDDの考え方によれば、ドメイン層、インフラストラクチャ層、アプリケーション層、インターフェース層に分けることができます。
インターフェイス層は、フロントエンド ユーザーに API インターフェイスを提供します。インフラストラクチャ層には、サードパーティのサービス、データベース接続などが含まれる場合があります。アプリケーション層はドメイン サービスのオーケストレーションであり、非常に薄い層です (現在、私自身のアーキテクチャは cqrs を使用しており、関連するロジックはすべてアプリケーション層に配置されていますが、ドメイン層はエンティティを配置するだけです。よく理解していないため)当面、ドメイン層のサービスとイベントがどのようなものを記述する必要があるか)。ドメイン層には、エンティティ、値オブジェクト、集約ルート、ドメイン サービス、ドメイン イベントなどが含まれます。

3. ASP.NET に対する ASP.NET Core の利点は何ですか?

  1. クロスプラットフォームの ASP.NET Core は、Windows、Linux、および MAC システム上で実行できます。
  2. フレームワークのインストールには依存関係はなく、すべての依存関係はプログラム自体にあります。
  3. ASP.NET Core はリクエストをより効率的に処理し、より多くのリクエストを処理できるようになります。
  4. ASP.NET Core には、さらに多くのインストールおよび構成方法があります。

4.asp.net core の主な機能は何ですか?

  1. 依存関係の注入。
  2. ロギング システム アーキテクチャ。
  3. クロスプラットフォーム Web サーバー kestrel を導入します。iis、apache、nginx なしで単独で実行できます。
  4. アプリはコマンドラインを使用して作成できます。
  5. AppSettings.json を使用してプロジェクトを構成します。
  6. start up を使用してサービスを登録します。
  7. 非同期プログラミングのサポートが強化されました。
  8. Web ソケットとシグナル IR をサポートします。
  9. クロスサイトリクエストの防止および保護メカニズム。

5. ASP.NET Core フィルターは依存関係の挿入をどのようにサポートしますか?

  1. 依存関係の注入をサポートするためにグローバルに登録可能
  2. TypeFilter(typeof(Filter)) によってメソッド内でマークされ、コントローラー内でマークされます
  3. メソッドを ServiceType (typeof(Filter)) でマークし、コントローラーでマークすることにより、Filter カテゴリを登録する必要があります。TypeFilter
    と ServiceType の本質は、IFilterFactory インターフェイスを実装することです。

6. Asp.Net Core にはどのような例外処理ソリューションがありますか?

1.Controllerを継承してOnActionExecutedを書き換えると、
デフォルトでControllerクラスが継承され、OnActionExecutedが書き換えられ、例外処理が追加されます。
一般に、新しい BaseController を作成し、すべてのコントローラーが BaseController から継承できるようにします。コードは以下のように表示されます。

  public class BaseController : Controller
    {
    
    
        public override void OnActionExecuted(ActionExecutedContext context)
        {
    
    
            var exception = context.Exception;
            if (exception != null)
            {
    
    
                context.ExceptionHandled = true;
                context.Result = new ContentResult
                {
    
    
                    Content = $"BaseController错误 : {
      
       exception.Message }"
                };
            }
            base.OnActionExecuted(context);
        }
    }

2. ActionFilterAttribute を使用します。
ActionFilterAttribute は IActionFilter と IResultFilter 自体を実装する機能であるため、アクションでスローされたエラーであってもビューでスローされたエラーであっても、理論的にはキャッチできます。新しい ExceptionActionFilterAttribute を作成し、OnActionExecuted と OnResultExecuted を書き換えて、例外処理を追加します。完全なコードは次のとおりです。

public class ExceptionActionFilterAttribute : ActionFilterAttribute
    {
    
    
        public override void OnActionExecuted(ActionExecutedContext context)
        {
    
    
            var exception = context.Exception;
            if (exception != null)
            {
    
    
                context.ExceptionHandled = true;
                context.Result = new ContentResult
                {
    
    
                    Content = $"错误 : {
      
       exception.Message }"
                };
            }
            base.OnActionExecuted(context);
        }

        public override void OnResultExecuted(ResultExecutedContext context)
        {
    
    
            var exception = context.Exception;
            if (exception != null)
            {
    
    
                context.ExceptionHandled = true;
                context.HttpContext.Response.WriteAsync($"错误 : {
      
      exce  ption.Message}");
            }
            base.OnResultExecuted(context);
        }
    }

使用方法は 2 つあり、
コントローラー内で [TypeFilter(typeof(ExceptionActionFilter)] にラベルを付けるか、スタートアップにフィルターとしてグローバルに挿入します。

 services.AddControllersWithViews(options =>
 {
    
    
 	options.Filters.Add<ExceptionActionFilterAttribute>();
 })

3. IExceptionFilter を使用する
Asp.Net Core には 5 種類のフィルターが用意されており、IExceptionFilter はその 1 つであり、名前が示すように、例外を処理するために使用されます。Asp.net Core の ExceptionFilterAttribute にはすでに IExceptionFilter が実装されているため、ExceptionFilterAttribute を継承してそのメソッドを書き直すだけで済みます。また、新しい CustomExceptionFilterAttribute を作成して、ExceptionFilterAttribute を継承し、OnException を書き換えて、例外処理を追加します。完全なコードは次のとおりです。

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
    
    
        public override void OnException(ExceptionContext context)
        {
    
    
            context.ExceptionHandled = true;
            context.HttpContext.Response.WriteAsync($"CustomExceptionF}");
            base.OnException(context);
        }
    }

4. ExceptionHandler を使用する
起動時にデフォルトで VS の新規プロジェクトが追加されます。

 if (env.IsDevelopment())
 {
    
    
	 app.UseDeveloperExceptionPage();
 }
else
{
    
    
    app.UseExceptionHandler("/Home/Error");
}

5. ミドルウェアの
グローバル処理によるミドルウェアの処理のカスタマイズ

public class ErrorHandlingMiddleware
    {
    
    
        private readonly RequestDelegate next;

        public ErrorHandlingMiddleware(RequestDelegate next)
        {
    
    
            this.next = next;
        }

        public async Task Invoke(HttpContext context)
        {
    
    
            try
            {
    
    
                await next(context);
            }
            catch (System.Exception ex)
            {
    
    
                //处理异常
            }
        }
    }

7. ASP.NET Core のサービスのライフサイクルを紹介しますか?

ASP.NET Core は、依存関係の挿入ソフトウェア設計パターンをサポートしています。これにより、サービスをさまざまなコンポーネントに挿入し、サービスの初期化を制御できます。一部のサービスは短期間で初期化でき、特定のコンポーネントとリクエストでのみ使用できます。また、一部のサービスは一度初期化した後でのみアプリケーション全体で使用できます。
シングルトン -- シングルトン モード:
サービスのインスタンスが 1 つだけ作成され、このインスタンスはメモリに保存され、アプリケーション全体で使用できます。シングルトン モードは、初期化にコストがかかる一部のサービスに使用できます。コードでは次のようになります。

 services.AddSingleton<IProductService, ProductService>();

スコープ付き --
このモードでは、リクエストごとにサービスのインスタンスが作成されます。同じリクエスト内のすべてのミドルウェア、MVC コントローラーなどは、同じサービス インスタンスを取得します。Entity Framework Context は、スコープ付きサービスの最良の参考例です。AddScoped メソッドを使用して Scoped パターンを使用できます。

 services.AddScoped<IProductService, ProductService>();

Transient -- 有効期間が短く一時的な
Transient モードでは、サービスが要求されるたびにサービス インスタンスが作成されます。このモードは、軽量でステートレスなサービスに特に適しています。AddTransient メソッドを使用してサービスを注入できます。

services.AddTransient<IProductService, ProductService>();

8. 依存性注入とは何ですか?

依存関係の注入はプロセスです。つまり、クラスが特定のタスクを完了するために別のクラスを呼び出す必要がある場合、呼び出し側のクラスで呼び出されたクラスの新しいオブジェクトに移動するのではなく、そのようなオブジェクトを取得する方法を注入します。具体的な実装は、呼び出しクラスに呼び出されるクラスのインターフェースを持ち、そのインターフェースの関数を呼び出すことでタスクを完了します。たとえば、A が B を呼び出し、B がインターフェイス C を実装する場合、変数 D は A の C によって定義されます。この変数のインスタンスは A で作成されず、A のコンテキストを通じて取得されます。この利点は、クラス A とクラス B を分離し、インターフェイス C で接続してインターフェイス プログラミングを実現できることです。

9. 依存性注入にはどのような方法がありますか?

セッター注入:
クラス A の C インターフェイスのプロパティ D を定義し、A のコンテキストで B を介してオブジェクトをインスタンス化し、このオブジェクトをプロパティ D に割り当てます。主なことは、
コンストラクター インジェクションの設定と取得です。A
のオブジェクトを作成するときに、B のオブジェクトがパラメーターを通じて A に渡されます。もう 1 つの一般的な注入方法は、ファクトリ モードの適用です。これにより、B のインスタンス化を A の外部に配置できるため、A と B に関係がなくなります。また、インターフェイス インジェクションもあります。つまり、クライアント クラス (A) のインターフェイスにサービス クラス (B) の属性が存在します。このインターフェースのサブクラスをインスタンス化した後、このプロパティに値を割り当てます。これはセッター注入と同じです。
コンストラクター
インジェクションやプロパティ インジェクションと比較すると、インターフェイス インジェクションはやや複雑で、一般的には使用されません。具体的なアイデアは、依存関係を設定するためのメソッドを含むインターフェイスを最初に定義することです。次に、クラスに依存し、このインターフェイスを継承して実装します。

10. 制御の反転とは何ですか?

Inversion of Control (略して IoC) は、コンピューター コード間の結合を減らすために使用できるオブジェクト指向プログラミングの設計原則です。最も一般的な方法は依存性注入 (Dependency Injection、略して DI) と呼ばれ、別の方法は「依存性ルックアップ」と呼ばれます。
制御の反転により、オブジェクトが作成されると、そのオブジェクトが依存するオブジェクトへの参照が、システム内のすべてのオブジェクトを制御する外部エンティティによってオブジェクトに渡されます。依存関係がオブジェクトに注入されるとも言えます。

11. 依存性注入の有名なフレームワークは何ですか?

Unity、autofac、http://spring.net、MEF、Injection、Asp.Net Core の ServiceCollection。

12. ABP.NEXT について紹介しますか?

ASP.NET Boilerplate は、.Net プラットフォーム用の優れたオープンソース Web アプリケーション フレームワークであり、中国でも多くのファンを抱えており、名前からもわかるように、ASP.NET Boilerplate の次世代フレームワークです。ABP フレームワークは 2013 年に作成されました。当時は、.Net Core や ASP.NET Core も、Angular2+ もありませんでした。ABP のリリース後、それらはすべてゼロから開発されました。
ASP.NET Core には、依存関係の挿入、ログ記録、キャッシュ、ローカリゼーション、構成などのための多くの組み込みソリューション (拡張ライブラリ) が導入されています。これらは実質的に ASP.NET Core から独立しており、あらゆる種類のアプリケーションで使用できます。

13. ドットネットコアのスタートアップクラスとは何ですか?

Startup クラスは、ドット ネット コア アプリケーションのエントリ ポイントです。すべてのドット ネット コア アプリケーションにはこのクラスが必要です。このクラスはアプリケーションを構成するために使用されます。このクラスの呼び出しは、プログラムの main 関数で構成されます。クラス名は自分で定義できます。

14. スタートアップクラスのconfigureメソッドの機能は何ですか?

このメソッドは、アプリケーション全体が HTTP リクエストにどのように応答するかを定義します。これには、アプリケーションビルダー、ホスティング環境、ロゴファクトリーなど、いくつかの重要なパラメーターがあり、ここでパス、認証、セッションなどを処理するためにいくつかのミドルウェアを構成できます。

15. ミドルウェア(Middleware)とは何ですか?

ミドルウェアは、要求と応答を処理するためにアプリケーション パイプラインに組み込まれるソフトウェアです。コンポーネントごと: パイプライン内の次のコンポーネントにリクエストを渡すかどうかを選択します。作業は、パイプライン内の次のコンポーネントが呼び出される前後に実行できます。リクエスト デリゲートは、リクエスト パイプラインを構築し、各 HTTP リクエストを処理するために使用されます。リクエスト デリゲートは、Run、Map、および Use 拡張メソッドを使用して構成されます。別のリクエスト デリゲートは、インライン匿名メソッド (インライン ミドルウェアと呼ばれる) で指定することも、再利用可能なクラスで定義することもできます。これらの再利用可能なクラスとインライン匿名メソッドは、ミドルウェアまたはミドルウェア コンポーネントです。リクエスト フロー内の各ミドルウェア コンポーネントは、パイプライン内の次のコンポーネントを呼び出し、必要に応じてチェーン ショートを行います。

16. ミドルウェアの利用シーンは何ですか?

認証、セッション保存、ロギングなど。実際、Asp.net コア プロジェクト自体には、すでに多くのミドルウェアが含まれています。例えば、本人認証ミドルウェアUseAuthorization()シリーズなど

17. 一般的に使用されている公式ミドルウェアを挙げてください。

例外/エラーの処理 アプリケーションが開発環境で実行されている場合: 開発者例外ページ ミドルウェア (UseDeveloperExceptionPage) は、アプリケーションの実行時エラーを報告します。「データベース エラー」ページのミドルウェアは、データベースの実行時エラーを報告します。アプリケーションが運用環境で実行されている場合: 例外ハンドラー ミドルウェア (UseExceptionHandler) は、次のミドルウェアでスローされた例外をキャッチします。HTTP Strict Transport Security (HSTS) ミドルウェア (UseHsts) は、Strict-Transport-Security ヘッダーを追加します。
HTTPS リダイレクト ミドルウェア (UseHttpsRedirection) は、HTTP 要求を HTTPS にリダイレクトします。
静的ファイル ミドルウェア (UseStaticFiles) は静的ファイルを返し、その後のリクエスト処理を簡素化します。
Cookie ポリシー ミドルウェア (UseCookiePolicy) により、アプリは EU 一般データ保護規則 (GDPR) に準拠できるようになります。リクエストをルーティングするためのルーティング ミドルウェア (UseRouting)。
認証ミドルウェア (UseAuthentication) ユーザーに安全なリソースへのアクセスを許可する前に、ユーザーの認証を試みます。
ユーザーに安全なリソースへのアクセスを許可するために使用される認可ミドルウェア (UseAuthorization)。
セッションミドルウェア (UseSession) は、セッション状態を確立および維持します。アプリでセッション状態を使用する場合は、Cookie ポリシー ミドルウェアの後、MVC ミドルウェアの前にセッション ミドルウェアを呼び出します。
Razor Pages エンドポイントを要求パイプラインに追加するためのエンドポイント ルーティング ミドルウェア (MapRazorPages での UseEndpoints)。

18. ミドルウェアの実行順序は何ですか?

例外/エラー処理
HTTP 厳密なトランスポート セキュリティ
HTTPS リダイレクト
静的ファイル サーバー
Cookie ポリシーの適用
認証
セッション
MVC

19. アプリケーションビルダーの使用方法と実行方法の違いは何ですか?

これらのメソッドは両方とも、スタートアップ クラスのconfigure メソッドで呼び出されます。どちらも、アプリケーション要求パイプラインにミドルウェアを追加するために使用されます。Use メソッドは次のミドルウェアの追加を呼び出すことができますが、run メソッドは呼び出すことができません。

20. ドット ネット コア パイプラインのマップ拡張機能の機能は何ですか?

異なるパスに対して異なるミドルウェアを追加できます。

public void Configure(IApplicationBuilder app)
 {
    
    
 	app.Map("/path1", Middleware1);
 	app.Map("/path2", Middleware2);
 }

21. ドット ネット コアのパスはどのように処理されますか?

パス処理は、受信リクエストのハンドラー関数を見つけるために使用されるメカニズムです。すべてのパスは関数実行の開始時に登録されます。
パスの処理方法には、主に通常のパス処理と属性パス処理の 2 つがあります。従来のパス処理はMapRouteのように呼び出しパスを設定することであり、属性パス処理とは呼び出し元の関数の上にパス属性を設定することを指します。

22. dot net core プロジェクトの共通プロジェクト ファイルとは何ですか

グローバル、起動設定、アプリ設定、バンドル設定、バウアー、パッケージ。

23. 依存性注入の実装原理は何ですか?

DI を実装するには、依存関係注入コンテナ IContainer が核となり、次の機能があります
①. (コンテナ) 利用可能なサービスのコレクションを保存します // 使用する特定のオブジェクト、クラス、インターフェイス サービス
②. (登録) を提供しますさまざまなコンポーネントを依存するサービスにバインドする方法; // Add... 関数または containerBuilder.Register 関数、
③. (解析ポイント) は、アプリケーションが構成されたオブジェクトを要求する方法を提供します: コンストラクター インジェクション、属性インジェクション。実行時に、フレームワークはレイヤーごとにリフレクションを通じてインスタンスを構築し、最終的に完全なオブジェクトを取得します。

24. ASP.NET Core プロジェクトの IP アドレスとポート番号を設定するにはどうすればよいですか?

Properties フォルダーにある launchSettings 構成ファイルを使用して、さまざまな起動方法を構成し、IP とポート番号をそれぞれ構成できます。

おすすめ

転載: blog.csdn.net/weixin_45091053/article/details/128060958