我有一个在MVC5中创建的网站,没有webapi控制器只是简单的MVC。从数据层分离OData
我们使用3个项目:MVC
,Business
和DataLayer
。
的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()
会做业务层的呼叫,询问数据库为所有在业务层转换成他们的ItemViewModel
Items
。
问题是OData预计会打开DataContext
,因此它可以查询,但现在它不会工作,因为我提早关闭DataContext
。
我该如何使这个可测试?
更多的代码将不胜感激,但是_items是一个datacontext? – Schandlich
不,它不是。 _items是一个实现接口,它返回一个简单的'IEnumerable()' –
YesMan85
你在你的crud方法中使用using语句吗?像使用(var context = new DataContext())? – Schandlich