Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据层分离OData_C#_Asp.net Web Api_Odata - Fatal编程技术网

C# 从数据层分离OData

C# 从数据层分离OData,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,我有一个网站,它是在MVC5中创建的,没有webapi控制器,只有普通的MVC 我们使用3个项目:MVC、Business和DataLayer MVC保存MVC项目、控制器、视图、视图模型等 businesslayer被注入MVC项目控制器的构造函数中 在businesslayer中,进行了一些常见检查,但大多数情况下,它尝试对数据库执行CRUD EF位于数据层项目中。此项目将再次注入businesslayer 通过这种方式,我们可以使用模拟分别测试每个项目。数据项目打开一个DataContex

我有一个网站,它是在MVC5中创建的,没有webapi控制器,只有普通的MVC

我们使用3个项目:
MVC
Business
DataLayer

MVC保存MVC项目、控制器、视图、视图模型等

businesslayer被注入MVC项目控制器的构造函数中

在businesslayer中,进行了一些常见检查,但大多数情况下,它尝试对数据库执行CRUD

EF位于数据层项目中。此项目将再次注入businesslayer

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

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

我添加了一个新的ODataWebAPI控制器,我立即发现它想要在API控制器中使用
DataContext
。这不是我想要的行为,因为它不稳定。我尝试将我的控制器转换为这样:

    public IQueryable<ItemViewModel> GetItem()
    {
        var items = _items.Get();
        return (IQueryable<ItemViewModel>) items;
    }
public IQueryable GetItem()
{
var items=_items.Get();
返回(IQueryable)项目;
}
\u items.Get()
将调用业务层,向DB请求所有
项目
,业务层将其转换为
项目视图模型

问题是OData需要一个打开的
DataContext
,这样它就可以处理它的查询,但现在它不起作用了,因为我很早就关闭了
DataContext


我怎样才能使它可测试?

我看到了这篇文章,它澄清了很多事情


我停止使用
EntitySetController
并实现了我自己的
ODataController
,我可以将其绑定得更多。

我最终将实体数据存储到内存中,并更改
OData
签名,如下所示:

public class ProjectsController : ODataController
{
        // GET: odata/Projects
        [EnableQuery]
        public IHttpActionResult GetProjects()
        {
            var projects = ProjectManager.GetProjects();
            return Ok(projects.AsQueryable());
        }
}
这样我们就不需要将UI层与数据访问层紧密连接


我们希望有更多的代码,但“项目”是datacontext吗?不是_items是一个带有实现的接口,它返回一个简单的
IEnumerable()
在crud方法中是否使用using语句?就像使用(var context=new DataContext())?是的,它会立即打开和关闭DataContext。如果您使用的是Unity,请尝试一下。那你是怎么解决的呢?如何实现ODataController以适应这种情况?我曾经将OData查询转换为EF并使用它。基本上,您是直接将其传递到数据层,虽然不是很好,但它可以工作。