2012-05-31 11 views
7

WCFを介してビジネスオブジェクトを転送するために、いくつかのDTOクラスを作成する必要があります。DTO。プロパティまたはフィールド?

これらが無い機能を用いてデータのちょうど袋なので、私はフィールドを使用することはできません何らかの理由がある、またはプロパティとして適切にそれらを公開するためにいくつかの理由がありますか?

//fields 
[DataContract] 
class CustomerDTO 
{ 
    [DataMember] public int  Id; 
    [DataMember] public string Name; 
} 

//or properties? 
[DataContract] 
class CustomerDTO 
{ 
    [DataMember] public int Id    { get; set; } 
    [DataMember] public string Name    { get; set; } 
} 

答えて

4

これらが無い機能を用いてデータのちょうど袋なので、私は公共の場に対しては強い引数がここにはありません

フィールドを使用することはできません何らかの理由があります。しかし、それは、カプセル化の通常の議論が成り立たないように、DTOの中に論理(振る舞い)がないからだけであることを理解してください。

私はまだプロパティを好みますが、ここでは本当に必要ありません。

+0

ありがとうございます。純粋に一貫性のためにプロパティを使用します。 – GazTheDestroyer

0

私はフィールドを直接公開することはありませんが、ほとんどの企業は標準でこれを禁止しています。効果的にカプセル化を完全に破棄します。 DTOは、より複雑なものの貧血表現は、そのプロパティがカプセル化をかなり中断するため、奇妙なケースです。個人的には、私はそれが彼らのためにあるので、プロパティを使用したいと思います。また、フィールドを直接微調整している場合に、それが簡単ではない場合は、「ダーティー」な機能などを実装することもできます。

+0

一つの問題は、プロパティは、構造タイプを持っている場合、その構造体の任意の部分にアクセスすると、全部の余分な一時的なコピーを作成する必要がありますということです。このような無駄なコピー操作は、構造体フィールドを公開する際には不要です。 – supercat

2

DataMember属性は、パブリックフィールドとプロパティの両方で動作しますので、どちらかが可能です。しかし、私はプロパティを貼り付けることをお勧めします。

特に、StyleCopを使用している場合は、rule SA1401が破損しています。

このルールの存在理由は、本当にあなたの場合には適用されませんが、あなたが継続的インテグレーションサーバ上のビルドの一部としてStyleCopの検証を実行している場合、それはまだメンテナンスの問題だろう。

+3

ソリューションは、特定の場所にこれらのDTOを配置した場合、1はちょうどその場所のため、この特定のルールにstylecopオーバーライドを持つことができます。 – Oded

+0

確かに、それでもまだ解決する必要のあるメンテナンスの問題です。 – devdigital

1

いずれかを使用できます。それがパフォーマンスには影響しませんので、あなたが公共の場では動作しませんいくつかのシリアル化フレームワークまたは同様に実行した場合の特性を一緒に行くオフより安全になるだろう。 WCFプロキシ生成を使用して、サービス側のパブリックフィールドを使用している場合でも、パブリックプロパティとそのバックアップのプライベートフィールドにクライアント側でをこれらのDTOを作成することを

注意。どうにかしたくない場合は、サービスとクライアントの間でDTOライブラリを共有する必要があります。プロパティを持つ

関連する問題