Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在ASP.NET核心Web Api项目中调用DAL_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

Asp.net core 如何在ASP.NET核心Web Api项目中调用DAL

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();

我有一个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 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();