Windows Phone和Windows 8 Modern应用程序的数据层抽象



我正在尝试将我的WP应用程序移植到Windows 8,同时保持可移植的模型和视图模型类。然而,我的应用程序已经在Windows Phone 7上使用了SQLCE,所以我的原始模型类都用映射到SQLCE表的属性来装饰。由于SQLCE不适用于WinRT应用程序,我想抽象数据访问,以便我可以继续在手机上使用SQLCE,但在Windows 8上使用SQLite。

有没有人提出一个合理的,工作的抽象层,不消除使用IQueryable的能力?类似地,有没有人成功地在Windows Phone上使用SQLCE的XML映射,而不是属性映射?如果我不需要在我的模型类和DAL类似物之间手动转换,那就太好了。

(我在我的博客上对此有一点咆哮,这可能有助于进一步了解我的问题。)

我已经确定为可移植代码(视图模型,助手等)提供一个每个平台的"核心"程序集,并为每个数据库/后台存储(SqlCe, Sqlite等)提供一个单独的程序集,平台特定的核心程序集引用似乎可以工作。这意味着我的模型类仍然在DAL程序集中定义,但我至少可以提供一个简单的、通用的接口(在每个DAL程序集中定义,不幸的是,因为DAL模型类),它仍然为我提供了IQueryable支持。

由于Visual Studio中的"copy as link",设置核心程序集并确保每个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

它远没有我想要的那么干净,但至少它似乎行得通。

最新更新