2009-05-11 19 views
5

単純なエンティティトランスレータを使用して、実際のサーバー側のビジネスオブジェクトにDTOの値をマップするWebサービスを作成しました。このエクササイズの一環として。 のヌル値のクライアントは、の値が設定されていないという「面白い」区別があります。nullと値が設定されていない

問題は、我々は、クライアントが明示的にただし、クライアントが明示的に意味している場合を知る方法がありません標準NULL可能なタイプを使用して、値を設定していない場合は、実際のビジネスオブジェクトにデフォルト値を設定することを本質的に"nullに設定する"または設定しないでください。

ここの解決策は、明らかに「フラグ」なんらかの種類です。

ビジネスオブジェクト内では、プロパティセッター内で設定されたプライベート "IsDirty"フラグを使用してフィールドの状態を内部的に追跡できますが、DTOは実際にはインターフェイスのみを指定するため、このデータを公開します。これにはいくつかの実装オプションがあります。言語はC#(静的に型指定されているので)です。

  1. 各プロパティに「IsSet」フラグが表示される可能性がありますか?
  2. 各プロパティは、.Valueプロパティと.IsSetプロパティを持つクラスとして公開できますか? などなど

データ契約上のこれらの「フラグ」を公開する方法あなたが選ぶでしょうか? あなたはこれについてベストプラクティスとして何を考えていますか?

これに関するご意見をいただければ幸いです。

答えて

3

プロパティ値ごとにクラスを使用すると、各プロパティに対してブール値を宣言する必要がなくなり、スケーラビリティが向上します。空のままにすることができるプロパティとnullに設定できるプロパティを選択することもできます。

3

あなたは、データとのフラグをラップするクラスを書くことができる:

public class DtoData<T> 
{ 
    T data; 
    bool IsSet { get; private set; } 
    T Data 
    { 
    get { return data; } 
    set { data = value; IsSet = true; } 
    } 
} 


public class XyzDto 
{ 
    // only private setters, initialize in constructor 
    DtoData<int?> SomeInt { get; private set; } 
    DtoData<string> SomeString { get; private set; } 
} 

これにはいくつかの欠点があります。たとえば、すべてのデータが参照型でラップされているため、DtoDataへの参照はnullのままである可​​能性があります。コンストラクタでそれらを作成する必要があります。また、内部または保護された値だけにアクセスできるようにするのは難しいです。


個人的には、私はこの問題を回避しようとします。なぜ "定義されていない"ことが実際に存在すべきですか?あなたは相違点、不完全なDtos、またはそれがどこから来たのかを送っていますか?この問題にはフィルタが付いている可能性があります。ここでは、フィールドをNULLにフィルタリングするか、まったくフィルタリングしない場合に違いが必要です。しかし、このようなシナリオでは、とにかく特殊な "フィールドフィルター"クラスが必要です。

0

私は以前この正確な問題に遭遇しました。あなたはDTOの構築にあるデフォルト値を導入することでこれを回避できますが、理想的ではありません。私は詳細をhereでブログしました、それは誰かが問題をさらに理解するのを助けるかもしれません。

1

ここでは、ユーザーが設定できる値とは異なるデフォルト値を使用しています。だからそれを指定してください。ユーザーが設定できる値の許容範囲外の値にデフォルト値を設定します。そうすれば、値がデフォルトの場合、設定されていないことがわかります。値がそれ以外の値であれば、ユーザーはその値を知っています。ユーザーが設定できる値の1つがnullの場合は、あなたを捨てているようです。ユーザー設定可能な値のセットの1つであると考えてください。 1つの追加デフォルト値を使用して、変数の範囲全体を少し大きくします。それはあなたの問題を解決するはずです。

関連する問題