asp.net核心2.1控制器动作返回类型的存储库签名

时间:2018-06-17 06:15:01

标签: asp.net asp.net-core

我正在尝试修改我的Asp.net Core 2.1项目以使用新的控制器操作返回类型(https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-2.1#actionresultt-type

他们提供的控制器示例是:

[HttpGet("{id}")]
[ProducesResponseType(200)]
[ProducesResponseType(404)]
public ActionResult<Product> GetById(int id)
{
    if (!_repository.TryGetProduct(id, out var product))
    {
        return NotFound();
    }

    return product;
}

然而,此方法的存储库签名是什么样的?

如果我尝试:

public async Task<Product> TryGetProduct(int id)

然后我收到一个错误,即没有存储库方法需要2个参数。

但如果我尝试:

public async Task<Product> TryGetProduct(int id, out var product)

然后我得到:

异步方法不能有ref或out参数

2 个答案:

答案 0 :(得分:1)

签名将是

#include "stdafx.h"
#include <iostream>
#include <cmath>

int scene(0);
char calculators[3][25] = 
{
    "",
    "Pythagorean Theorem",
    "Homer's Formula"
};
void selection() 
{
    std::cout << "Enter a number to select a calculator." << std::endl; // Opening
    for (int i = 1; i <= 2; i += 1) {
        std::cout << "Option " << i << ": " << calculators[i] << std::endl;
    }
}

void pTheorem() 
{
    int a;
    int b;
    std::cout << "Enter side a: ";
    std::cin >> a;
    std::cout << "Enter side b: ";
    std::cin >> b;
    std::cout << "Side length of c is " << sqrt(pow(a, 2) + pow(b, 2)) << std::endl;
}

int main() 
{
    switch(scene) 
    {
        case 0:
            selection();
            std::cin >> scene;
            std::cout << "You've selected the " << calculators[scene] << " Calculator" << std::endl;
            break;
        case 1:
            pTheorem();
            break;
    }
    return 0;
}

在实现中,如果您的数据库有public interface IRepository { bool TryGetProduct(int id, out Product product); } 值的记录,您将把它设置为Product对象并返回Id,否则true

像这样(未经过测试

false

答案 1 :(得分:1)

要保留异步任务功能,您可以执行此操作。

public interface IRepository
{
    Task<bool> TryGetProduct(int id, out Product product);
}

public class Repository : IRepository
{
    public Task<bool> TryGetProduct(int id, out Product product)
    {
        product = _db.Products.SingleOrDefault(x => x.Id == id);

        return Task.FromResult(product != null);
    }
}

然后在控制器中。

[HttpGet("{id}")]
[ProducesResponseType(200)]
[ProducesResponseType(404)]
public async Task<ActionResult<Product>> GetById(int id)
{
    // await 
    if (!await _repository.TryGetProduct(id, out var product))
    {
        return NotFound();
    }

    return Ok(product);
}