2012-01-03 3 views
2

私たちはWCF(Entity Frameworkではなく)に基づいてn層システムを構築しており、大規模エンティティの更新を実装する最良の方法について議論しました。 データをクライアントに送信するときに、DTOを作成し、ドメインモデルのデータをtheeseにマップしました。 クライアントは、現在の実装では、同じDTOを使用して変更を加えて戻します。 エンティティの中には80-100のプロパティを持つものもありますが、おそらくクライアントは1つまたは複数のプロパティのみを変更します。 DTO全体にデータを取り込み、それを送り返してから、プロパティが実際に変更されたサーバー側で把握しようとすると、効率が悪いようです。 これを実装するより良い方法はありますか、または「ブルートフォース」メソッドを使用する必要がありますか? 将来的に私たちは非ネットクライアントをサポートする必要があるので、私たちのソリューションを.net固有のものに結びつけたくありません。サービスによる大規模エンティティの更新

+1

過度のエンジニアリングを行わないように注意してください。パフォーマンスの問題があることがわかるまでは、パフォーマンスの問題を修正するべきではありません。そうしないと、間違った問題を解決する可能性があります。 –

+0

私も[類似の質問](http://stackoverflow.com/q/1344066/122781)を見つけました。 – HappyNomad

答えて

0

すべてのDTOに変更されたプロパティ名の文字列を含めることで、この問題を解決しました。サービス内の更新コードは、この配列内の名前を持つプロパティの検証と書き込みのみを行います。

コードを簡単にするために、この文字列配列を抽象基本クラスに入れ、そこからすべての「変更可能な」DTOを継承しました。たとえば:DTO多型が、この場合に必要とされていないため

<DataContract> 
Public MustInherit Class ChangeTrackableObject 
    <DataMember> Public Property Changes As HashSet(Of String) 
End Class 

には<KnownType>属性はありません。 DataContractSerializerは継承関係を使用して基本クラスのプロパティを取得します。

このシステムは、.NETおよびJavaクライアントコードからも同様に機能するようです。 Javaクライアントはこれを文字列配列として認識します。私たちは.NETクライアントのための拡張メソッドのライブラリを持っていて、データを簡単に埋め込むことができます。

0

クライアントがデルタ更新を送信できるようにすることができます。すべてのオブジェクトは、サーバーが管理する固有のGUIDを持つことができます。あなたは、GUIDを使用してオブジェクトを検索し、対応するプロパティを更新することができ、サーバー側では、デルタ

void UpdateProperty(Guid objguid , 
      string propertyname , string propertyvalue); 

を送信するように

あなたはWCFメソッドを持つことができます。

+0

この方法の問題点は、プロパティの変更が10回ある場合は10回のサービスコールを行うことです。 – SliverNinja

0

スキーマが大きい場合は、XMLをWebメソッドパラメータとして、オプションの要素を持つXSDとともに使用できます。これは特定のプラットフォームに結びついていません。一意のキー識別子とともに変更された要素を送信することができます。

関連する問題