我应该如何在ASP.NET Core Web Api项目中调用我的DAL

时间:2018-05-29 14:11:17

标签: asp.net-core asp.net-core-2.0

我有一个带有Full Framework的ASP.NET Core 2.1 Web Api项目,因为EF Core仍然不支持存储过程映射和复杂类型生成。

所以我的DAL依赖于EF6来对抗.net 4.6.1。

我构建了一个数据访问服务IDatabaseService,它公开了所有允许的数据库操作,并在Startup.cs中将其添加为作用域服务:

public interface IDatabaseService
{
    IReadOnlyList<Product> GetAllProducts();
}

public class DatabaseService: IDatabaseService
{
    private readonly WebApiDataProvider provider;

    public DatabaseService(IOptions<ApiSettings> options)
    {
        this.provider = new WebApiDataProvider(options.Value.DbConnectionString); // provider creates a new DbContext here
    }

    public IReadOnlyList<Product> GetAllProducts()
    {
        return this.provider.GetAllProducts().ToList(); // provider calls the GetAllProducts stored proc method on the created context here
    }
}

我现在的问题是如何在我的控制器中处理这个问题。一方面,我应该更喜欢异步操作来阻止请求线程池,以便它可以返回并提供其他请求。另一方面,我不应该使用Task.Run()包装同步操作。那么最好的方法是什么:

[Route("api/[controller]")]
[ApiController]
public class ProductsController : Controller
{
    private readonly IDatabaseService databaseService;

    public ProductController(IDatabaseService databaseService)
    {
        this.databaseService = databaseService;
    }

    [HttpGet]
    public Task<ActionResult<Product>> GetAllProducts()
    {
        return Task.Run(() =>
        {
            return this.Ok(this.databaseService.GetAllProducts());
        });
    }
}

[Route("api/[controller]")]
[ApiController]
public class ProductsController : Controller
{
    private readonly IDatabaseService databaseService;

    public ProductController(IDatabaseService databaseService)
    {
        this.databaseService = databaseService;
    }

    [HttpGet]
    public ActionResult<Product> GetAllProducts()
    {
        return this.Ok(this.databaseService.GetAllProducts());
    }
}

或者我应该完全不同并声明我的服务方法

Task<List<Product> GetAllProducts();

所以可以等待吗? Tbh我是这样开始的,但从我的观点来看,这里唯一的区别是我将同步数据库调用更深一层。

总结我的问题:

  • 我希望能够执行我的数据库调用异步,以便能够同时提供其他请求
  • 我觉得使用Task.Run()可能不是实现此目的的最佳方式
  • 那么这里最好的模式是什么?

提前谢谢

0 个答案:

没有答案