0

新しい WCF プロジェクトを作成すると、サンプル サービスが生成されます。デフォルトのデータ コントラクトは次のとおりです (文字列型のフィールド タイトルを変更したところです)。

[DataContract]
public class CompositeType
{
    bool boolValue = true;
    string name = "";

    [DataMember]
    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    [DataMember]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

これらのプライベート フィールドboolValuenameを持つポイントは何ですか? データのサニタイズやその他の操作をコントラクトに記述して肥大化させるのは良い習慣ですか? フィールドに直接書き込まないことが唯一の正当な理由のようです。それで、それはブロートウェアですか、それとも何らかの理由がありますか?

4

3 に答える 3

2

私の意見では、DataContracts の唯一の目的は、ドメイン間でデータを転送することです。検証/サニタイズ ロジックは、DataContract の責任範囲外にある必要があります。特に、再利用のために複数のプロジェクト/プラットフォームでコード ファイルを共有/リンクすることが意図されている場合。

これは、アプリケーションの他の場所で DataContract オブジェクトを使用してはならないことも意味します。コンテンツをアプリケーション固有のオブジェクトに読み書きするには、ある種のアダプターまたはコンバーターを通過する必要があります。その変換(またはアプリケーションオブジェクト)で、検証を行うことができます。データ転送層が単純であるほど良いです。

おそらく、必要に応じてデータの入力/出力を追跡するために、セッター/ゲッターにログ記録/デバッグ コードを (できれば一時的に) 追加することもできます。これまでのところ、単純なプロパティ以外のものを DataContract オブジェクトに入れても問題ないと感じたのはこれだけです(繰り返しますが、一時的に入れただけです)。

編集:これがデフォルトで生成されたファイルである理由については、よくわかりません。私の DataContract オブジェクトは常に自動プロパティを使用しています。これは、自動プロパティが導入される前の .NET 2.0 への逆戻りだったのかもしれませんが、WCF/DataContracts はいずれにせよ 3.0 まで導入されませんでした。

于 2012-06-21T21:49:08.460 に答える
1

プライベート値のゲッターとセッターを作成するのと同じ理由で、カプセル化を支援し、変数を直接操作していたために外部メンバーが壊れることを心配することなく、クラスの内部動作を操作できるようにします。

于 2012-06-21T21:15:58.030 に答える
1

簡単に言えば、パブリック プロパティを使用すると、設計者はプライベート フィールドに値を割り当てる前に値を制限できるため、予期しないデータを処理する必要がなくなる可能性があります。ほとんどの get メソッドと set メソッドは同じですが、多くの場合、不正なデータに対する防御の最前線です。

于 2012-06-21T21:24:49.470 に答える