0

问候。我正在使用通用存储库来方便访问两个不同且必要的数据存储;一个本地 SQLite DB 和一个远程 REST WS(在 C# 中用于移动 MonoDroid 应用程序)。

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[]我的问题是,在将其添加到Treturn 之前,我需要对其进行转换或强制转换List<T>,但我不确定最好的方法是什么。我的 DB 层方法DBSelect构建并返回 a ,因为这是从该方法List<object[]>获取查询结果的最直接和通用的方式(我认为)(每个是一行,每一列 a 。我也可以通过调用将行存储到 a 中,但仍然会有铸造/转换问题)。SqliteDataReaderGetValue(i)object[]objectstring[]GetString(i)

我真的很想在这里使用通用存储库,即使静态类型的存储库是一个快速修复。我也坚持使用两个存储库(我已经阅读了许多关于存储库的帖子,其中的答案指出了为什么不应该使用两个存储库来解决数据重复问题,等等......)。除此之外,我愿意接受任何和所有建议。谢谢您的帮助!

4

1 回答 1

1

您需要以任何方式映射。因此,这只是代码组织的问题,该代码将驻留在强类型存储库类或实体类中。

类 foo : IDataReader publit void Construct(Object[] row)

然后您的存储库将是 IRepository 其中 T: IDataReader

于 2012-07-27T15:34:37.917 回答