我有一个在MVC5中创建的网站,没有webapi控制器只是简单的MVC。
我们使用3个项目:MVC
,Business
和DataLayer
。
MVC拥有MVC项目,控制器,视图,视图模型等。
将业务层注入到MVC项目的控制器的构造函数中。
在业务层中完成了一些常见的检查,但主要是它尝试对数据库进行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
。
我怎样才能使这个可测试?
答案 0 :(得分:0)
我看到这篇文章清除了很多东西。
我停止使用EntitySetController
并实施了我自己的ODataController
,我可以将其绑定得更多。
答案 1 :(得分:0)
我最终将实体数据存储到内存中并更改OData
签名,如下所示:
public class ProjectsController : ODataController
{
// GET: odata/Projects
[EnableQuery]
public IHttpActionResult GetProjects()
{
var projects = ProjectManager.GetProjects();
return Ok(projects.AsQueryable());
}
}
这样我们就不需要将UI层紧密到数据访问层。