2014-01-10 124 views
1

我有一个在MVC5中创建的网站,没有webapi控制器只是简单的MVC。从数据层分离OData

我们使用3个项目:MVC,BusinessDataLayer

的MVC持有MVC项目,控制器,视图的ViewModels等

的businesslayer注入到MVC项目的控制器的构造函数。

在businesslayer中完成了一些常见的检查,但大多数情况下它试图对数据库执行CRUD。

EF位于数据层项目中。该项目再次被注入到业务层。

通过这种方式,我们可以用嘲笑来分别测试每个项目。数据项目打开DataContext,执行CRUD操作,关闭连接并将结果返回给业务层,该业务层将结果再次返回给MVC项目/控制器。

现在的问题。由于需要离线功能,该项目已经发生变化,我开始使用AngularJS + JayData。 JayData提供了一个简单的odata实现,我想开始使用OData来获取信息到前端。

我添加了一个新的OData webAPI控制器,我立即发现它想要在API控制器中使用DataContext。这不是我想要的行为,因为它是无法测试的。我试着将我的控制器变成这个样子:

public IQueryable<ItemViewModel> GetItem() 
    { 
     var items = _items.Get(); 
     return (IQueryable<ItemViewModel>) items; 
    } 

_items.Get()会做业务层的呼叫,询问数据库为所有在业务层转换成他们的ItemViewModelItems

问题是OData预计会打开DataContext,因此它可以查询,但现在它不会工作,因为我提早关闭DataContext

我该如何使这个可测试?

+0

更多的代码将不胜感激,但是_items是一个datacontext? – Schandlich

+0

不,它不是。 _items是一个实现接口,它返回一个简单的'IEnumerable ()' – YesMan85

+0

你在你的crud方法中使用using语句吗?像使用(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