Asp.net core 如何在ASP.NET核心Web Api项目中调用DAL
我有一个ASP.NET Core 2.1 Web Api项目,它有完整的框架,因为EF Core仍然不支持存储过程映射和复杂类型生成 因此,我的DAL依赖于EF6而不是.NET4.6.1 我构建了一个数据访问服务IDatabaseService,它公开了所有允许的DB操作,并将其作为作用域服务添加到Startup.cs中:Asp.net core 如何在ASP.NET核心Web Api项目中调用DAL,asp.net-core,asp.net-core-2.0,Asp.net Core,Asp.net Core 2.0,我有一个ASP.NET Core 2.1 Web Api项目,它有完整的框架,因为EF Core仍然不支持存储过程映射和复杂类型生成 因此,我的DAL依赖于EF6而不是.NET4.6.1 我构建了一个数据访问服务IDatabaseService,它公开了所有允许的DB操作,并将其作为作用域服务添加到Startup.cs中: public interface IDatabaseService { IReadOnlyList<Product> GetAllProducts();
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
}
}
公共接口IDatabaseService
{
IReadOnlyList GetAllProducts();
}
公共类数据库服务:IDatabaseService
{
私有只读WebApiDataProvider;
公共数据库服务(IOptions选项)
{
this.provider=new WebApiDataProvider(options.Value.DbConnectionString);//provider在此处创建一个新的DbContext
}
公共IReadOnlyList GetAllProducts()
{
返回此.provider.GetAllProducts().ToList();//提供程序在此处对创建的上下文调用GetAllProducts存储过程方法
}
}
我现在的问题是如何在控制器中处理这个问题。一方面,我希望异步操作不阻塞请求线程池,这样它就可以返回并服务于其他请求。另一方面,我不应该用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());
});
}
}
[路由(“api/[控制器]”)]
[ApiController]
公共类产品控制器:控制器
{
专用只读IDatabaseService数据库服务;
公共产品控制器(IDatabaseService数据库服务)
{
this.databaseService=databaseService;
}
[HttpGet]
公共任务GetAllProducts()
{
返回任务。运行(()=>
{
返回this.Ok(this.databaseService.GetAllProducts());
});
}
}
或
[路由(“api/[控制器]”)]
[ApiController]
公共类产品控制器:控制器
{
专用只读IDatabaseService数据库服务;
公共产品控制器(IDatabaseService数据库服务)
{
this.databaseService=databaseService;
}
[HttpGet]
公共行动结果GetAllProducts()
{
返回this.Ok(this.databaseService.GetAllProducts());
}
}
或者我应该做完全不同的事情并声明我的服务方法吗
Task<List<Product> GetAllProducts();
task或者您更改为EFCore,或者您必须使用不在.Net Core上运行的完整框架项目。我已经使用了完整框架。因此,您建议如果是这样,将我的操作声明为非异步?
Task<List<Product> GetAllProducts();