0

敬礼。私は汎用リポジトリを使用して、2つの別個の必要なデータストアへのアクセスを容易にしています。ローカルSQLiteDBとリモートRESTWS(モバイルMonoDroidアプリの場合はC#)。

interface IRepository<T>
{
  List<T> Read(ICond cond);
}

class RepositorySQL<T>: IRepository where T : new()
{
  List<T> Read(ICond cond)
  {
    sqlArgs = convertCond(cond);   // convert cond to sql arguments

    List<object[]> results = dbLayer.DBSelect(sqlARgs);  // sqlite SELECT wrapper

    List<T> returnList = new List<T>();

    for(int i=0; i < results.Count; i++)
    {
      object[] oa = results[i];

      T t = new T();

      // cast/convert oa to T
      ///////////////////////////

      t = (T)oa;                // override cast operator ???
      t = oa;                   // override = operator ???
      t.Convert(oa);            // use a method/delegate somehow ???

      returnList.Add(t);
  }
}

私の問題は、リターンに追加する前に、それぞれobject[]をに変換またはキャストする必要があることですが、最善のアプローチが何であるかがわかりません。私のDBLayerメソッドは、メソッドからクエリ結果を取得するための最も直接的で一般的な方法であるため、ビルドして返します(それぞれが行、各列がaです。代わりにを呼び出すことで行をに格納することもできます。ただし、キャスト/変換の問題は引き続き発生します)。TList<T>DBSelectList<object[]>SqliteDataReaderGetValue(i)object[]objectstring[]GetString(i)

静的に型付けされたリポジトリは簡単な修正ですが、私は本当にここでジェネリックリポジトリを使用したいと思います。私も2つのリポジトリにこだわっています(リポジトリに関する多くの投稿を読んで、データ重複の懸念などの理由で2つを使用すべきではない理由を指摘しています...)。それ以外は、あらゆる提案を受け付けています。助けてくれてありがとう!

4

1 に答える 1

1

何らかの方法でマッピングが必要です。したがって、このコードが存在するコード編成の問題は、厳密に型指定されたリポジトリ クラスまたはエンティティ クラスです。

class foo : IDataReader publit void Construct(Object[] 行)

次に、リポジトリは T: IDataReader の IRepository になります。

于 2012-07-27T15:34:37.917 に答える