【问题标题】:Multiple entities with one web api controller具有一个 Web api 控制器的多个实体
【发布时间】:2015-06-02 00:21:07
【问题描述】:

我正在使用 ef6 代码优先类型 db 构建一个基于 mvc 的网站。现在我有一个名为 Categories Controller 的 web api 控制器,它可以很好地工作并将 json 数据发送到我的 js 请求。

    // GET: api/Categories
    public IQueryable<Category> GetCategories()
    {
        return db.Categories;
    }

现在我需要为产品、材料和其他一些实体进行相同的接线。我想要的是这样的: //GET: api/数据/类别 //GET: api/Data/Products

等等。全部连接到一个 DataController。有没有办法做到这一点?

例如一个数据控制器,所有类别特定的 API 操作、产品特定的 API 操作等都有单独的代码区域。然后我可以做 /api/Data/Categories/Create 或 api/Data/Products/Create

【问题讨论】:

  • 为什么不能在一个类或匿名对象中返回所有这些?
  • Generic WebApi Controller。你介意每个实体类都有一个控制器类吗?如果你这样做,你可以 implement your own IHttpControllerSelector 返回 new GenericCRUDController&lt;T&gt; 其中 T 根据请求的控制器解析,映射到实体类型。

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

您可以通过创建一个包含两者的新类来解决此问题,而不是引入新技术。 我假设它们之间没有关系,例如产品有类别,但你只想要两者。

// GET: api/Data/ProductCategories
public IQueryable<ProductsCategory> GetProductsCategories()
{
    return GetProductsCategories();
}

...

public class ProductsCategory
{
    public IEnumerable<Category> Categories { get; set;}
    public IEnumerable<Product> Products{ get; set;}
}

...
public ProductsCategory GetProductsCategories()
{
    var products = db.Products.ToList();
    var categories = db.Categories.ToList();

    var productCategories = new ProductsCategory()
    {  
        Products = products,
        Categories = categories
    };

    return productCategories;
}

或某种程度的东西。

也不要直接返回 IQueryable,这是多余的并且不建议使用,除非该 API 的调用者将以某种方式针对已返回的内容执行一些查询,这不太可能将其视为其 WebAPI 而不是某种方法。而是返回 ListIEnumerable

如果你也想改进你所拥有的东西,请务必将你拥有的存储库包装在某种服务中,这样你就可以说:

productsService.GetProductsCategories()

而不是直接在您的 API 中访问上下文。

存储库和服务层扩展阅读

https://codereview.stackexchange.com/questions/33109/repository-service-design-pattern

Difference between Repository and Service Layer?

【讨论】:

  • 是否可以验证多个实体?例如,如果我想更新一批实体,我需要检查它们是否有效?
【解决方案2】:

最简单的方法是实现 OData 控制器或 Breeze 控制器。他们将完成所有繁重的工作以在 Web APi 端点中公开您的 EF 模型:

它们非常易于设置,并且 OData 是此类任务的公认标准。他们都预先构建了对老化、过滤、分页的支持,包括相关的集合等。有 Nuget 包可以同时使用它们。

Breeze 还为 JSC# 提供功能丰富的客户端,以及许多额外的功能。

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 2020-07-08
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2015-03-27
    • 2017-03-01
    相关资源
    最近更新 更多