LinqToSqlでWCFを使用して子オブジェクトを維持するにはどうすればよいですか?
-
03-07-2019 - |
質問
現在、このソリューションの設計にこだわっています。
データレイヤーの設計は以下で構成されています。
- レシピ(親の高レベルオブジェクト)
- 言語の詳細(名前、言語による説明)(多く)
- ヘッダー(多数)
- 手順(多く)
- 材料(多く)
- 数量(多数)
- 手順(多数)
- メモ(多数)
- 言語の詳細(名前、言語による説明)(多く)
私が抱えている課題は、WCF SaveRecipe(recipe)メソッドからオブジェクトが生成されたときに、データベース内の子オブジェクトを追加/削除するデータアクセスデザインを作成する方法ですか?
これはすべて、管理にアプリケーションに通信レイヤーを追加するように要求することに起因します。現在、UIはビジネスレイヤーに結合され、BLはDALに直接結合されています。 BLおよびDAL。
このスレッドを読みましたが、L2Sを使用することはWCFよりも良いアイデアではありませんが、デザインは新しいものではないため、このタイプの方法論を使用し、大量のUI作業をリファクタリングできるようになったら、それから離れる必要があります。
解決
WCFを使用してデータを送信しようとしている場合は、ドメイン内を移動するデータのモデルを作成することをお勧めします。私が知る限り、IQueryableオブジェクトをシリアル化することはできませんが、Linqが生成する一連のクラスを作成してからシリアル化することができます。例:
[DataContract]
public class Recipe {
[DataMember]
public string Name { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public List<Ingredient> Ingredients { get; set; }
}
次に、それを埋めます
List<Recipe> recipes = (from r in dc.recipe
select new Recpie {
Name = r.name,
Description = r.description,
Ingredients = (Linq code to make list of ingredients)
}).ToList();
そして、WCFを使用してリストを送信すると、簡単になります。
他のヒント
あなたが参照したスレッドでのKarlのこの回答が好きです:
独自に作成することをお勧めします データ転送のクラス オブジェクト。もちろん、これらのクラスは、 DataContractsとして実装されます。 サービスレイヤーでは、変換します linq-to-sqlオブジェクトと データキャリアオブジェクトのインスタンス。 それは退屈ですが、それは分離します からのサービスのクライアント データベーススキーマ。また、 より良い制御を提供する利点 で渡されるデータの システム。
とにかくリファクタリングする必要があるようです-同様に、UIレイヤーでlinq2sqlへの依存関係をリファクタリングすることから始めます。
迅速かつ簡単な解決策があるとは思わない。
WCFでL2Sクラスを公開することはお勧めしません。 DataContractオブジェクトの階層を作成し、それらをWCFに渡します。この欠点は、「コピーを深くする」必要があることです。 L2SオブジェクトをDataContract階層に追加しますが、利点は、ネットワーク経由の転送に必要かつ適切なフィールドのみを含めることができることです。たとえば、現在作業中のプロジェクトでは、ほとんどのL2S Employeeフィールドを含むが、従業員のソルトハッシュなどのデータを除外するEmployeeDataオブジェクトをネットワーク経由で渡します。パスワードソルト。
子エントリを含むクラスと除外するクラスの両方を作成することも考えられます。私は時々このようなクラスを作成しました:
class Recipe {
[DataMember] public string Name;
[DataMember] public string Description;
}
class RecipeWithIngredients : Recipe {
[DataMember] public IList<Ingredient> Ingredients;
}
編集:投稿が完了する前に誤って投稿されました。