0
public AreaModel(Int64 AreaId)
{
    CurrentAreaId = AreaId;
    CurrentSet = true;
    var c = Client;
}

private ManagementServiceClient Client
{
    get
    {
        if (_client == null || _client.State == (CommunicationState.Closed | CommunicationState.Faulted))
        {
            _client = new ManagementServiceClient();
            _client.Open();
        }

        var c = Areas;

        return _client;
    }
}

public Management_Area[] Areas
{
    get
    {
        return Client.GetAreaHeaders();
    }
}

このコードは、MVC ビューに渡されるカスタム モデルの効果です。

私たちの会社には、(私たちにとって)奇妙なコードをたくさん書いた開発者がいて、突然退職しました。彼のコードの多くは非常に特殊な方法で書かれているため、彼が実際に自分のしていることを知っていたのか、それともまったく知らなかったのかを知ることは困難です。

私がこの質問をしている理由は、彼がここで何をしていたかを見たからですが、それが機能するかどうか、または実際に何を意味するのかはわかりません.

最初の質問は次のとおりです。AreaModel のコンストラクターが呼び出されると、Client.GetAreaHeaders() が呼び出されますか? 理由はわかりますが、実際にそうであると完全に確信しているわけではありません. サービス側の GetAreaHeaders 内にブレークポイントを配置しました。これは、呼び出された場合にトリガーされるはずだったので、「いいえ、呼び出されません」と言う方向に傾いています...しかし、ブレークポイントが実際に正しくあったかどうかはわかりません完了または「ヒット」(IISでこのサービスをセットアップしたばかりで、以前はデバッグする理由がありませんでした)、より詳しい人から「呼び出されるべきだったのですか?」と知りたかったのです。なぜ、またはそうでないのか。このコードから、それを書いた人は、それが呼び出されることを確実に予期していたことがわかるからです。

彼はサービス呼び出しの結果のある種のキャッシュを実装するというアイデアについて考えていたように見えますが、実際にそれを有用な場所に保存することはできませんでした (なぜなら、彼がそれを読み取ろうとすると、GetAreaHeaders() ではないからです)。もう一度呼び出されるだけですか?)。それで、誰かがよく知っている場合の私の2番目の質問は、完全に機能している場合、このようなものをキャッシュすることは理にかなっていますか? ページが読み込まれるたびにモデルが再作成される場合、ビュー/コントローラーで一度アクセスしてスコープ内の変数に保存するのではなく、モデルの作成時に「領域」を事前に入力したほうがよいのはなぜですかページの?私には、同じくらいの時間がかかるように思えます。

この質問がよく説明され、理にかなっていることを願っています。質問を編集して、すべての人にとってより有益になる方法があれば教えてください。

4

1 に答える 1

1
  1. Client.GetAreaHeaders()AreaModelのコンストラクターが呼び出されたときに呼び出されます。Clientプロパティがアクセスされ、Clientの getter にこのステートメントがあるため、呼び出されます。このステートメントは、を呼び出すプロパティにvar c = Areas; アクセスします。そうは言っても、使用されないローカル変数を作成するため、ステートメントは不要です。彼はプロパティを初期化するためにこれを行った可能性がありますが、これは型破りな方法ですが、コンストラクター自体で初期化する必要があります。AreasClient.GetAreaHeaders()var c = Client;cClient

  2. キャッシュは、適切な量の作業が実行されている場合はいつでも有効です。したがって、結果をキャッシュすると、2 回目のアクセスでの応答時間が改善されます。そうは言っても、すべてのキャッシュと同様に、ダーティになる可能性がありますが、これは考慮する必要がある場合とそうでない場合があります。このキャッシングが役立つかどうかは、このモデルを使用する正確なコントローラー/アクション ロジックとビュー ロジックに依存します。ほとんどのシナリオでは、これはおそらく不要です。これは、セッションやデータベースなどのより永続的な場所にデータを保存しない限り、リクエストごとにすべてが作成および破棄される Web アプリケーションであるため、おそらく不要です。また、ゲッターは何も格納せず、ローカル変数も格納しないため、ステートメントvar c = Areas;はコンストラクターでの同様の呼び出しよりもさらに役に立ちません。Areasc繰り返しますが、使用されることはありません。

したがって、サービス呼び出しの変数へのキャッシュは、_clienta) サービスの初期化にコストがかかる場合、および b)Clientの単一インスタンスのプロパティAreaModelが同じ要求内で複数回アクセスされる場合にのみ役立ちます。

コードをもう一度確認すると、プロパティがプロパティにアクセスし、プロパティが再びClientプロパティにアクセスするため、無限ループが発生するようです。AreasClient

于 2013-08-24T16:09:54.000 に答える