5

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

問題は基本的に、クライアントが明示的に値を設定していない場合に実際のビジネスオブジェクトにデフォルト値を設定したいということですが、標準のnull許容型を使用すると、クライアントが明示的に「これをnullに設定」を意味したかどうかを判断する方法がありません。または単にそれを設定しません。

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

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

  1. 各プロパティに「IsSet」フラグを公開できますか?
  2. 各プロパティを.Valueプロパティと.IsSetプロパティを持つクラスとして公開できますか?などなど。

データ契約でこれらの「フラグ」をどのように公開することを選択しますか?ここでは、このためのベストプラクティスとして何を考えますか?

これについてのご意見をいただければ幸いです。

4

4 に答える 4

3

各プロパティ値にクラスを使用すると、各プロパティにブール値を宣言するよりもスケーラブルになります。また、空のままにしたり、nullに設定したりできるプロパティを選択することもできます。

于 2009-05-11T07:53:33.030 に答える
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のままである可​​能性があるため、コンストラクターでそれらを作成する必要があります。また、内部または保護された場合にのみ値にアクセスできるようにすることは困難です。


個人的には、この問題を回避しようと思います。なぜ「定義されていない」が実際に存在する必要があるのですか?違い、不完全なDtoを送信していますか、それともどこから来ていますか?この問題はフィルターで発生する可能性があります。フィールドをnullでフィルター処理する場合、またはまったくフィルター処理しない場合は、違いが必要になります。ただし、このようなシナリオでは、とにかく特別な「フィールドフィルター」クラスが必要です。

于 2009-05-11T07:56:46.443 に答える
1

一般に、ここで話しているのは、ユーザーが設定できる値とは異なるデフォルト値です。したがって、それを指定するだけです。デフォルトを、ユーザーが設定できる値の許容範囲外の値に設定します。そうすれば、値がデフォルトの場合、設定されていないことがわかります。値がそれ以外の場合は、ユーザーがそれをいじくり回していることがわかります。ユーザーが設定できる値の1つがnullであるという理由だけで、あなたを失望させているようです。これは、ユーザーが設定可能な値のセットの1つと見なしてください。変数の範囲全体を少し大きく設定し、デフォルト値を1つ追加します。それはあなたの問題を解決するはずです。

于 2009-05-11T21:50:25.373 に答える
0

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

于 2009-05-11T08:08:01.853 に答える