【问题标题】:Making a generic query / getbyspecification in web api controller?在 web api 控制器中进行通用查询/getbyspecification?
【发布时间】:2017-08-15 14:14:31
【问题描述】:

我有一个带有一些 CRUD 操作的典型 API。我通常需要根据不同的参数获取某些对象。

一种方法是使用以下方法:

GetProjectsByCustomerId(int customerId);
GetProjectsBySigneeId(int signeeId);

但是,在我的服务层(在这种情况下为ProjectService),我通常使用如下方法,其中ProjectSpecification 通常具有相当多的字段甚至列表:

public IEnumerable<Project> GetBySpecification(ProjectSpecification projectSpecification)

这意味着,在我的梦想世界中,我希望有如下端点:

  • /api/projects(空规范,返回完整列表)
  • /api/projects?customerid=2(为 id 为 2 的客户获取项目)
  • /api/projects?signeeid=2,3(获取签名者 id 为 2 和 3 的项目)

我的问题是 - 这是怎么做的

我的第一次尝试是在我的ProjectController 中添加这个(调用我的ProjectService):

public class ProjectsController : ApiController
{
    public IEnumerable<Project> GetProjects(ProjectSpecification projectSpecification)
    {
        var projects = _projectService.GetBySpecification(projectSpecification);
        return projects;
    }
}

但是假设我打开了这个 URL:

/api/Projects?CustomerId=2

这不会被解析为 ProjectSpecification 视图模型。但是,如果我将控制器签名更改为:

public IEnumerable<Project> GetProjects(int customerid) { }

它会起作用,因为它是一个简单的类型。

我当然可以构建一些参数地狱,但我想我缺少一些非常明显的 MVC 魔法 - 可能在路由中? :-)

【问题讨论】:

  • 显示 ProjectSpecification 作为示例的一部分。还要查看参数上的FromUri 属性
  • ProjectSpecification 类可以正常工作,但您可能需要构建自定义模型绑定器(一点也不难)。或者,您可能想查看 OData,它几乎可以为您做到这一点。
  • @DavidG 我认为你是对的,ODATA 可能是我想要的,但为了这里的目的,让我们坚持使用 REST。这里自定义模态绑定器的最简单示例是什么? (谢谢顺便说一句=))
  • 对于 web api 看看这个 docs.microsoft.com/en-us/aspnet/web-api/overview/…[FromUri] 对于这种情况应该足够简单。

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api-routing


【解决方案1】:

参考文档

Parameter Binding in ASP.NET Web API : [FromUri]

要强制 Web API 从 URI 中读取复杂类型,请添加 参数的[FromUri] 属性。

例如假设

public class ProjectSpecification {
    public int CustomerId { get; set; }
    //...other properties
}

public class ProjectsController : ApiController {
    [HttpGet]
    public IHttpActinoResult GetProjects([FromUri]ProjectSpecification projectSpecification) {
        return Ok(projectSpecification);
    }
}

客户端可以将CustomerId值放入查询字符串中。

例如:

/api/Projects?CustomerId=2

Web API 将使用它们构造一个 ProjectSpecification 并将 CustomerId 设置为 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多