web-dev-qa-db-ja.com

.Net Core Web APIで自己参照ループを停止するにはどうすればよいですか?

.NET Core Web APIとEntity Framework Coreを使用した自己参照に関連していると私が推測しているいくつかの問題があります。いくつかのナビゲーションプロパティに.Includesを追加すると、Web APIが窒息し始めます。

古いWeb APIで解決策のように見えるものが見つかりましたが、.NET Core Web APIに同じものを実装する方法がわかりません(まだ学習の初期段階です)。

以前のソリューションは、Global.asaxのApplication_Start()にこれを固定していました:

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;

これはStartUpのConfigureService()メソッドで処理されるのではないかと思いますが、それ以上は知りません。

または、この問題を処理するより適切な方法はありますか?

19
Sailing Judo

わかりました...ついに参考資料を見つけました。解決策は次のとおりです。

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}

私はこれを here から入手しました

39
Sailing Judo

ReferenceLoopHandling.Ignoreは問題を「隠す」のではなく、解決します。あなたが本当にする必要があるのは、レイヤーを構築することです。ドメインオブジェクトを作成してエンティティの上に配置し、それらをある種のサービス/ビジネスレイヤーにラップします。リポジトリー・パターンを調べ、それが役立つ場合はそれを適用します。エンティティとドメインオブジェクト間をマッピングする必要があります。これにより、ある種のマッパー(オートマッパー)と検証レイヤーに適合する機会が得られます。

ドメインオブジェクトとエンティティがまったく同じである場合は、自分が何をしているかについてもっと考える必要があります。

例:エンティティに一時的な削除がありますか? (IsDeleted)フラグ?もしそうなら、これは必ずしもWeb経由でクライアントに戻る必要はありません。そのため、クライアントが異なる場合の完璧な例です。

どちらにしても、答えはJSONでオーバーライドするのではなく、アーキテクチャを変更することです。

4
Robert Perry