我有以下类(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对象的集合,因为该存储库直到运行时才知道我要喂食什么类型的对象。 。 您将如何存储满足以上要求的对象?
最佳答案
基础很简单:
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的存储库实现。