Я создал собственный класс репозитория с интерфейсом:
public interface IRepository<T>
{
//Retrieves list of items in table
IQueryable<T> List();
IQueryable<T> List(params string[] includes);
//Creates from detached item
T Create(T item);
//Updates from detached item
//Attached item can be change directly and using SaveChanges
T Edit(T item);
void Delete(int id);
void DeleteObject(object item);
T Get(int id);
T Get(int id, params string[] includes);
void SaveChanges();
}
Он заботится об основной операции CRUD, имеет также контекст. Над хранилищем у меня есть классы обслуживания, которые содержат бизнес-логин. Пример:
public interface IProjectService
{
IQueryable<Project> ListProjects();
Project GetProjectByName(string name);
Project GetProjectByID(int id);
bool EditBasicProjectData(Project project);
bool CreateProject(Project project);
bool DeleteProject(int id);
void SetCurrentProjectByID(int id);
}
Каждый сервис имеет необходимые репозитории. Контроллеры имеют сервисы, введенные NInject. Методы контроллера короткие, они только передают данные из сервисов для просмотра (в обоих направлениях). Это делает весь проект легко тестируемым. Вы можете смоделировать хранилище для тестирования сервиса. Вы можете смоделировать сервис для проверки контроллера.