На самом деле сейчас существует общее мнение, что репозитории доменов не должны быть общими. В вашем хранилище должно быть указано, что вы можете делать при сохранении или извлечении ваших сущностей.
Некоторые репозитории доступны только для чтения, некоторые - только для вставки (без обновления, без удаления), у некоторых - только определенные поиски ...
Используя GetAll return IQueryable, ваша логика запросов попадет в ваш код, возможно, на прикладной уровень.
Но все же интересно использовать предоставляемый вами интерфейс для инкапсуляции объектов Linq Table<T>
, чтобы вы могли заменить его реализацией в памяти для целей тестирования.
Поэтому я предлагаю назвать его ITable<T>
, дать ему тот же интерфейс, что и у объекта linq Table<T>
, и использовать его внутри вашего конкретного репозитория домена (не вместо).
Затем вы можете использовать свои определенные репозитории в памяти, используя реализацию ITable<T>
в памяти.
Самый простой способ реализовать ITable<T>
в памяти - это использовать List<T>
и получить интерфейс IQueryable<T>
, используя метод расширения .AsQueryable ().
public class InMemoryTable<T> : ITable<T>
{
private List<T> list;
private IQueryable<T> queryable;
public InMemoryTable<T>(List<T> list)
{
this.list = list;
this.queryable = list.AsQueryable();
}
public void Add(T entity) { list.Add(entity); }
public void Remove(T entity) { list.Remove(entity); }
public IEnumerator<T> GetEnumerator() { return list.GetEnumerator(); }
public Type ElementType { get { return queryable.ElementType; } }
public IQueryProvider Provider { get { return queryable.Provider; } }
...
}
Вы можете работать изолированно с базой данных для тестирования, но с действительно конкретными репозиториями, которые дают больше информации о домене.