【问题标题】:Separating OData from data layer将 OData 与数据层分离
【发布时间】:2020-12-09 15:37:18
【问题描述】:

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

我们使用 3 个项目:MVCBusinessDataLayer

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&lt;ItemViewModel&gt;()
  • 你在 crud 方法中使用 using 语句吗?喜欢使用 (var context = new DataContext())?
  • 是的,它会立即打开和关闭数据上下文。
  • 如果您使用的是 Unity,请尝试一下。 msdn.microsoft.com/en-us/library/dn337023(v=pandp.30).aspx

标签: c# asp.net-web-api odata


【解决方案1】:

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

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

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

【讨论】:

  • 那么你如何解决这个问题?您如何实现 ODataController 以适应这种情况?
  • 我使用 linqtoquerystring.net 将 OData 查询转换为 EF 并使用它。基本上你是直接将它传递给数据层,虽然不是很好,但它可以工作。
【解决方案2】:

我最终将实体数据存储到内存中,并将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/

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 2013-05-23
    • 2010-11-09
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多