将EnableQuery参数传递给存储库层

时间:2016-03-29 04:51:23

标签: entity-framework asp.net-web-api

不幸的是,我有一个我需要遵循的架构。对于我的项目,我们有两层:存储库层和服务层。

服务层在ASP.NET Web API中实现。我有一个方法将返回所有订单:GetOrders()。该方法只调用一个方法:存储库的GetOrders(),它在Entity Framework中实现。

我使用[EnableQuery]属性修饰了get方法,但是如何将这些可查询参数“传递”到存储库层中的GetOrders()?

以下是一些代码:

服务:

[EnableQuery]
public IQueryable<Order> GetOrders()
{
    return OrderRepository.GetOrders();
}

存储库:

public static class OrderRepository
{
    public static IQueryable<Order> GetOrders()
    {
        using (OrderContext context = new OrderContext())
        {
            ...
        }
    }
}

另外,STATIC关键字对我来说很麻烦。在你建议在类中的方法之外创建OrderContext的静态变量之前,我不能这样做。我的老板是当前模式的坚持者:没有静态变量等。他希望它全部包含在方法中。当我在方法中实例化DbContext时,如何从静态方法返回IQueryable?

再次感谢,所有人。

1 个答案:

答案 0 :(得分:0)

您无需将“任何内容”传递给GetOrders方法;你需要公开你的订单表的IQueryable,OData将为你做一切。例如,假设订单在订单表中:

[EnableQuery]
public IQueryable<Order> GetOrders()
{
    return OrderRepository.GetOrders();
}

public static class OrderRepository
{
    public static IQueryable<Order> GetOrders()
    {
        OrderContext context = new OrderContext()
        return context.Orders;
    }
}

查看this了解更多详情,非常简单明了。

BTW,您确定将所有存储库层静态化是一件好事吗?你可以尝试这样的事情:

private OrderRepository _repo;

public OrderController()
{
     _repo = new OrderRepository();
}

[EnableQuery]
public IQueryable<Order> GetOrders()
{
    return _repo.GetOrders();
}

public class OrderRepository
{
    private OrderContext _context;

    public OrderRepository()
    {
        _context = new OrderContext();
    }

    public IQueryable<Order> GetOrders()
    {
        _context.Orders;
    }
}