我正在将项目的数据访问部分移至WebAPI,并使用实体框架核心来执行EF。
我知道,当使用"控制器"时,首选模式现在依靠依赖注入来创建DBContext。"你好,世界!"教程显示了以下访问上下文的示例:
private BloggingContext _context;
public BlogsController(BloggingContext context)
{
_context = context;
}
我遇到的问题是我需要加一层...因为我有一个"服务"接口,可以公开存储库的方法。
我尝试将上下文实例化放入我的存储库中,但是,当然,当我尝试新的服务实例时,它需要通过上下文对象。我试图通过发送发送来解决它一个新的bloggingContext()作为上下文参数,但收到了错误:No database provider has been configured for this DbContext.
,当然,这是有道理的,因为我所传递的new
一个与与之关联的数据库没有连接。该连接是在启动.cs中定义的,如我所说的各种教程中所述,试图在此过渡上切牙。
因此,给定控制器中的以下代码,我该如何调用服务,仍然让依赖项注入执行其设计在存储库中的操作?
[HttpGet("{bool}")]
public IActionResult GetRoleNames(bool? isActive)
{
var service = new SecurityService();
try
{
return Ok(service.GetRoleNames(isActive));
}
catch (Exception ex)
{
Log.Error("Failed to get list of role names from the API", ex.Message);
return BadRequest(ex);
}
}
我很确定我也有 [HttpGet("{bool}")]
有点fubard,因为GetRoleNames
将允许NULL,但是在解决DI问题后我会越过那座桥。
使用依赖注入创建您的服务(我喜欢界面) -
private readonly ISecurityService _service;
public BlogsController(ISecurityService service)
{
_service = service;
}
使用构造服务调用您的方法
[HttpGet("{bool}")]
public IActionResult GetRoleNames(bool? isActive)
{
try
{
return Ok(_service.GetRoleNames(isActive));
}
catch (Exception ex)
{
Log.Error("Failed to get list of role names from the API", ex.Message);
return BadRequest(ex);
}
}
您的安全服务可以注入上下文
private readonly BloggingContext _context;
public class SecurityService : ISecurityService
{
public SecurityService (BloggingContext context)
{
_context = context
}
}
您可以在"配置"方法中在startup.cs中注册您的服务:
service.AddScoped<ISecurityService, SercurityService>();