2

移植可能なモデルとビューモデル クラスを維持しながら、WP アプリを Windows 8 に移植しようとしています。ただし、私のアプリは Windows Phone 7 用の SQLCE を使用しているため、元のモデル クラスはすべて、SQLCE テーブルにマッピングするための属性で装飾されています。WinRT アプリでは SQLCE を使用できないため、電話では引き続き SQLCE を使用できるようにデータ アクセスを抽象化し、Windows 8 では SQLite を使用したいと考えています。

を使用する能力を排除しない、正気で機能する抽象化レイヤーを思いついた人はいますIQueryableか? 同様に、属性マッピングではなく、Windows Phone で SQLCE の XML マッピングを使用して成功した人はいますか? モデル クラスと DAL 類似物との間で手動で変換する必要がなければいいのですが。

(私はブログでこれについて少し暴言を吐いています。これは、私の問題に関するさらなる背景を提供するのに役立つかもしれません。)

4

1 に答える 1

1

移植可能なコード (ビューモデル、ヘルパーなど) 用のプラットフォームごとの「コア」アセンブリと、プラットフォーム固有のコア アセンブリが参照するデータベース/バッキング ストア (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

私が望むほどきれいではありませんが、少なくともうまくいくようです。

于 2013-04-11T17:08:30.870 に答える