2014-01-10 4 views
1

У меня есть веб-сайт, созданный в 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.

Как я могу сделать это пригодным для тестирования?

+0

Больше кода будут оценены, но _items DataContext? – Schandlich

+0

Нет, это не так. _items - это интерфейс с реализацией, который возвращает простой 'IEnumerable ()' – YesMan85

+0

. Используете ли вы инструкцию using в своем методе crud? Как использовать (var context = new DataContext())? – Schandlich

ответ

0

Я столкнулся с этой статьей, которая очищает много вещей.

http://roysvork.wordpress.com/2013/06/24/is-using-odataiqueryable-in-your-web-api-an-inherently-bad-thing/

Я перестал использовать EntitySetController и реализовать мои собственные ODataController, которые я могу связать вниз гораздо больше.

+0

Итак, как вы разбираетесь? Как вы реализуете ODataController в соответствии с этой ситуацией? –

+0

Я использовал http://linqtoquerystring.net/, чтобы преобразовать запрос OData в EF и использовать его. В основном вы передаете его прямо на слой данных, но не очень хорошо, но он работает. – YesMan85

0

Я закончил с хранением данных сущности в памяти и изменить OData подпись следующим образом:

public class ProjectsController : ODataController 
{ 
     // GET: odata/Projects 
     [EnableQuery] 
     public IHttpActionResult GetProjects() 
     { 
      var projects = ProjectManager.GetProjects(); 
      return Ok(projects.AsQueryable()); 
     } 
} 

Таким образом, мы не должны плотно слой пользовательского интерфейса на уровне доступа к данным.

http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/

Смежные вопросы