将OData与数据层分开

时间:2014-01-10 16:37:00

标签: asp.net-web-api odata

我有一个在MVC5中创建的网站,没有webapi控制器只是简单的MVC。

我们使用3个项目:MVCBusinessDataLayer

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

我怎样才能使这个可测试?

2 个答案:

答案 0 :(得分:0)

我看到这篇文章清除了很多东西。

http://roysvork.wordpress.com/2013/06/24/is-using-odataiqueryable-in-your-web-api-an-inherently-bad-thing/

我停止使用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层紧密到数据访问层。

http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/