我已经确定为可移植代码(视图模型、帮助程序等)提供每个平台的“核心”程序集,以及平台特定的核心程序集引用的每个数据库/后备存储(SqlCe、Sqlite 等)的单独程序集似乎工作。这意味着我的模型类仍然在 DAL 程序集中定义,但我至少可以提供一个简单的通用接口(不幸的是,由于 DAL 模型类,在每个 DAL 程序集中定义)仍然为我提供 IQueryable 支持。
由于 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
它远没有我想要的那么干净,但至少它似乎有效。