【发布时间】:2020-12-09 15:37:18
【问题描述】:
我有一个在 MVC5 中创建的网站,没有 webapi 控制器,只是普通的 MVC。
我们使用 3 个项目:MVC、Business 和 DataLayer。
MVC 包含 MVC 项目、控制器、视图、视图模型等。
业务层被注入到MVC项目的Controllers的构造函数中。
在业务层中完成了一些常见的检查,但大多数情况下它会尝试对数据库进行 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() 将调用业务层,向数据库询问所有Items,业务层将它们转换为ItemViewModel。
问题是 OData 需要一个打开的 DataContext,因此它可以进行查询,但现在它不起作用,因为我提前关闭了 DataContext。
我怎样才能使它可测试?
【问题讨论】:
-
更多代码将不胜感激,但 _items 是数据上下文吗?
-
不,不是。 _items 是一个带有实现的接口,它返回一个简单的
IEnumerable<ItemViewModel>() -
你在 crud 方法中使用 using 语句吗?喜欢使用 (var context = new DataContext())?
-
是的,它会立即打开和关闭数据上下文。
-
如果您使用的是 Unity,请尝试一下。 msdn.microsoft.com/en-us/library/dn337023(v=pandp.30).aspx
标签: c# asp.net-web-api odata