敬礼。私は汎用リポジトリを使用して、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です。代わりにを呼び出すことで行をに格納することもできます。ただし、キャスト/変換の問題は引き続き発生します)。T
List<T>
DBSelect
List<object[]>
SqliteDataReader
GetValue(i)
object[]
object
string[]
GetString(i)
静的に型付けされたリポジトリは簡単な修正ですが、私は本当にここでジェネリックリポジトリを使用したいと思います。私も2つのリポジトリにこだわっています(リポジトリに関する多くの投稿を読んで、データ重複の懸念などの理由で2つを使用すべきではない理由を指摘しています...)。それ以外は、あらゆる提案を受け付けています。助けてくれてありがとう!