我有一个带有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我是这样开始的,但从我的观点来看,这里唯一的区别是我将同步数据库调用更深一层。
总结我的问题:
提前谢谢