質問

私たちは、単純なエンティティ トランスレータを使用して DTO の値を「実際の」サーバー側のビジネス オブジェクトにマッピングする Web サービスを作成しました。この演習の一環として。明示的に設定された間の「興味深い」違いに遭遇しました。 NULL値 とクライアントが 設定されていません 価値。

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

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

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

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

どうやって あなた データ コントラクトでこれらの「フラグ」を公開することを選択しますか?これに対するベストプラクティスは何だと思いますか?

これに関してご意見がございましたら、よろしくお願いいたします。

役に立ちましたか?

解決

各プロパティ値のクラスを使用すること有し、各プロパティのブール値を宣言することが、よりスケーラブルであろう。また、空および/またはnullに設定しておくことができますどのプロパティ選択することができますでしょう。

他のヒント

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

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またはあなたがすべてでそれをフィルタリングしない場合は、フィールドをフィルタリングする場合は、差額を必要とするフィルタ、で来ることができました。しかし、このようなシナリオのために、あなたはとにかく特殊な「フィールド・フィルタ」クラスを必要とします。

一般的には、あなたがここで話しているのは、ユーザーが設定することができます任意の値とは異なるデフォルト値です。だからそれを指定します。ユーザが設定できる値の許容範囲内にない値にデフォルトを設定します。値がデフォルトであればその方法は、あなたが知っている、それが設定されていません。値がそれ以外の場合、ユーザーがそれに手を加えています知っています。ただ、ユーザーが設定可能な値のいずれかがnullであるあなたを投げているように見えるので、ただそれは、ユーザ設定可能な値のセットの1つであると考えます。一つの追加のデフォルト値と、可変わずかに大きいセットの全範囲を作ります。それはあなたの問題を解決する必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top