質問: 私はいくつかの詳細なパフォーマンス統計を取得する手段としてデータベースクエリをインターセプトする方法を探しています。私は、クエリの数、クエリの継続時間、結果のデータ(データの大きさの考え方)、理想的にはLINQの式へのアクセスの後にいます。 私は、ベースコンテキストクラスを拡張し、 `DbSet`を取得する別のメソッドを作成してそこにラッパーを返すことに戻すことができますが、1)ハッキーに見えるよりも、2)キャッシュされた結果を区別できない実際のデータベースへのアクセス 私はコードを見て、 `ExecutionStrategyFactory`や`Database`ラップするように感じました。そして、 `RelationalDbContextOptionsBuilder`拡張メソッド、または/ replace / servicesを作成することはできますが、どちらのラッピング方法も見えません基礎となるプロバイダの実装が引き続き使用されるようにします。 (関連項目: https : //github.com/aspnet/EntityFramework/issues/6967 ) これにぴったりの場所はありますか?
回答: 他の誰かを参照してください: さて、トリックです: 1. `ReplaceService()`を介してEF CoreのDIシステムが使用する`IRelationalConnection`を置き換えます。新しい`MyRc`は既存の接続をラップしてフックを追加します 2. 私たちの`MyRc`には、 `MyRc`のコンストラクタパラメータが`IDatabaseProviderServices`ます。 EF DIシステムがそれを入力します。それを`IRelationalDatabaseProviderServices`キャストし、 `RelationalConnection`プロパティを取得します 3. すべてのメソッドをラップしますが、公開されています`DbConnection DbConnection { get; }` `DbConnection` -wrappingクラスのインスタンスを返す 4. *その*ラッピングクラスでは、 `CreateDbCommand()` `DbCommand` -wrappingクラスのインスタンスを返します 5. *その*包装クラスにおいて、有する`ExecuteDbDataReader()`のインスタンスを返す`DbDataReader` -wrappingクラス すると、中に`DbCommand`と`DbDataReader`ラッパー、私たちは、コマンドとパラメータは、データベースに送信されている、との結果が戻ってくるかを見ることができます。 これは、リレーショナル・モデルでのみ機能します。