我有以下类(class):

public class InMemoryRepository : IRepository
{
    public void Add(object entity)
    {
        throw new NotImplementedException();
    }

    public void Attach(object Entity)
    {
        throw new NotImplementedException();
    }

    public T Get<T>(object id)
    {
        throw new NotImplementedException();
    }

    public IList<T> GetAll<T>(string queryName)
    {
        throw new NotImplementedException();
    }

    public IList<T> GetAll<T>()
    {
        throw new NotImplementedException();
    }

    public IQueryable<T> Query<T>()
    {
        throw new NotImplementedException();
    }

    public void Remove(object entity)
    {
        throw new NotImplementedException();
    }

    public void Save(object entity)
    {
        throw new NotImplementedException();
    }
}

我们的默认存储库实现使用NHibernate作为后备存储,但是我想实现它的内存版本,这样我就可以对域对象进行原型(prototype)设计而不必创建后备SQL数据库。假设所有对象都具有Id属性作为主键,那么您将如何为此实现通用内存存储呢?

我很难解决的一些关键点:
  • 存储库方法本身是通用的,因此我需要一些机制来自动存储和引用不同的类型。 Get<TestEntity>(object id)应该能够查询所有存储的TestEntity实例并找到具有匹配的Id属性的实例,但是我无法直接定义TestEntity对象的集合,因为该存储库直到运行时才知道我要喂食什么类型的对象。 。
  • 我需要为Query()方法支持LINQ to Objects。假设我可以提出一种不错的方法来存储对象,这应该像返回一个存储对象数组AsQueryable()一样简单。

  • 您将如何存储满足以上要求的对象?

    最佳答案

    基础很简单:

    public class InMemoryRepository : IRepository
    {
        private readonly IList<object> entities = new List<object>();
    
        public T Get<T>(object id)
        {
            return entities.OfType<T>.SingleOrDefault(e => e.ID == id);
        }
    
        public IList<T> GetAll<T>()
        {
            return entities.OfType<T>.ToList();
        }
    
        public IQueryable<T> Query<T>()
        {
            return GetAll<T>.AsQueryable();
        }
    }
    

    但是,一旦涉及到public IList<T> GetAll<T>(string queryName),事情就会变得复杂。

    潜在地,您可以对测试使用基于SQLite的存储库实现。

    09-27 12:32