У меня есть веб-сайт, созданный в MVC5 без каких-либо webapi-контроллеров, просто простой MVC.Разделение OData с уровня данных
Мы используем 3 проекта: MVC
, Business
и DataLayer
.
MVC имеет проекты MVC, контроллеры, представления, ViewModels т.д.
businesslayer впрыскивается в конструкторах контроллеров проекта MVC.
В бизнес-слове некоторые общие проверки выполняются, но в основном он пытается сделать CRUD для базы данных.
EF находится в проекте datalayer. Этот проект снова вводится в бизнес-слот.
Таким образом, мы можем протестировать каждый проект отдельно с насмешкой. Проект данных открывает DataContext
, выполняет операцию CRUD, закрывает соединение и возвращает результат на бизнес-уровень, который снова возвращает результат проекту/контроллеру MVC.
Теперь проблема. Проект изменился из-за необходимости автономных возможностей, и я начал использовать AngularJS + JayData. JayData обеспечивает простую реализацию odata, и я хотел бы начать использовать OData для получения информации для интерфейса.
Я добавил новый контроллер WebAPI OData, и я сразу вижу, что он хочет использовать DataContext
в контроллере API. Это не то поведение, которое я хочу, потому что оно нецелесообразно. Я попытался преобразовать мой контроллер, чтобы стать, как это:
public IQueryable<ItemViewModel> GetItem()
{
var items = _items.Get();
return (IQueryable<ItemViewModel>) items;
}
_items.Get()
будет делать вызов на бизнес-уровне, который запрашивает БД для всех Items
, где бизнес слой превращает их в ItemViewModel
.
Проблема в том, что OData ожидает открытого DataContext
, так что это могут быть запросы, но теперь это не сработает, потому что я рано закрываю DataContext
.
Как я могу сделать это пригодным для тестирования?
Больше кода будут оценены, но _items DataContext? – Schandlich
Нет, это не так. _items - это интерфейс с реализацией, который возвращает простой 'IEnumerable()' –
YesMan85
. Используете ли вы инструкцию using в своем методе crud? Как использовать (var context = new DataContext())? – Schandlich