2009-07-13 3 views
7

どれくらい悪いですか?私は無数の記事を読んだことがあります。以前は抽象的なDataContractsを作成したことはありませんでしたが、そうすることで、サブクラスの実装を決定する工場がどこからでも作成できなくなるという問題が解決されるようです。私の質問は、データ契約に行動を加えることにした場合、私は罰せられるのですか?もちろん、リポジトリ呼び出しを呼び出す前にそのサブクラスタイプに固有の特定の操作を実行してデータを保持することはできません。私は各サブクラスの "マネージャ"クラスを作成することができますが、それは工場に戻ってきます。もっと多態的なアプローチを試みています。前もって感謝します。動作しているデータコントラクト

答えて

7

古典的な方法でデータコントラクト(MyDataContract)を作成することはできません。なぜなら、データフィールドだけでは何もありません。

public class BehaviorialClass : MyDataContract 
{ 
..... 
} 

こうすることで、あなたは懸念の素敵な、明確な分離を持って、あなたのデータコントラクトはそれが本当にとにかく扱うことができない行動によって「汚染」ではありません.....

マルク・

6

DataContractsに直接ビヘイビアを配置することは、コントラクトと同じアセンブリまたは別のアセンブリ全体のいずれかに、定義動作をextension methodsとして定義することです。必要に応じて、拡張メソッドを契約とは別の名前空間に配置して、データと動作の分離をさらに強化することができます。

あなたの契約はきれいに保たれますが、同時に契約の.NET消費者は、それらのDataContractsに関連する追加機能を簡単にインポートすることができます。

12

データコントラクトに必要なすべての動作を追加できます。あなたは、その行動がクライアントに見えない、または後で誰かが失望するという事実を明確に文書化する必要があります。実装に依存するデータをデータコントラクトに追加しないように気をつけなければならないという事実を文書化してください。これは、クライアントに渡すものではないからです。

私は、データ契約をデータ契約とし、行動を外したほうがよいと思います。

+0

'データ契約をデータ契約にして、その行動を外す方が良いと思います。 それに気づく! –

0

ある時点で、不必要な中間データ変換(さらに悪いことに、不要なメンテナンス)なしにMemberwiseCloneを使用してインターフェイスを実装したいと思うこともあります。拡張メソッドは、文字通りオブジェクト定義を制御することはできませんが、依然としてオブジェクト指向の流暢性が必要な場合に使用します。それ以外の状況ではビジーな作業を追加し、C/C++よりも悪いクラス定義を散布します。 「トレンド」を取り戻し、あなたのために何ができるのかを考えれば、(Jeffrey RichterのAsyncEnumeratorのような)ボールゲーム全体を変えるパターンを見つけることができます。

関連する問題