移植可能なコード (ビューモデル、ヘルパーなど) 用のプラットフォームごとの「コア」アセンブリと、プラットフォーム固有のコア アセンブリが参照するデータベース/バッキング ストア (SqlCe、Sqlite など) ごとの個別のアセンブリを持つことを決定しました。動作するようです。これは、私のモデル クラスが引き続き DAL アセンブリで定義されていることを意味しますが、少なくとも IQueryable サポートを引き続き提供するシンプルで共通のインターフェイス (残念ながら、DAL モデル クラスのために各 DAL アセンブリで定義されます) を提供できます。
Visual Studio の "リンクとしてコピー" のおかげで、コア アセンブリをセットアップし、共通のデータベース サービス インターフェイスが各 DAL アセンブリで同じであることを確認するのは非常に簡単です。#ifdef
多くの DAL モデル クラス ファイルを再利用して、属性やデータベース固有のコードなどを条件付きでコンパイルすることもできます。これにより、それらにも「リンクとしてコピー」を使用できます。
public interface IDataService
{
IQueryable<ModelType1> ModelType1 { get; }
IQueryable<ModelType2> ModelType2 { get; }
void AddModelType1(ModelType1 item);
void RemoveModelType1(ModelType1 item);
void AddModelType2(ModelType2 item);
void RemoveModelType2(ModelType2 item);
void CreateDatabase();
void ResetDatabase();
}
結果の参照のマップは、次のようなものです。
System.Data.Linq -> App.Data.SqlCe -> App.Core.WP -> App.WP
/ /
(some shared code) (all shared code)
/ /
Sqlite -> App.Data.Sqlite -> App.Core.Win8 -> App.Win8
私が望むほどきれいではありませんが、少なくともうまくいくようです。