使用存储库模式实施依赖注入的混乱-C#EF核心



我正在将项目的数据访问部分移至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>();

最新更新