gpt4 book ai didi

c# - 使用存储库模式实现依赖注入(inject)的混淆 - c# EF Core

转载 作者:行者123 更新时间:2023-11-30 21:44:10 25 4
gpt4 key购买 nike

我正在将项目的数据访问部分移动到 WebAPI 并使用 Entity Framework Core 来完成 EF 的工作。

我知道现在首选的模式是在使用“ Controller ”时依赖依赖注入(inject)来创建 dbContext。 “你好,世界!”教程显示了通过以下方式访问上下文的示例:

    private BloggingContext _context;

public BlogsController(BloggingContext context)
{
_context = context;
}

我遇到的问题是我需要向上一层...因为我有一个公开存储库方法的“服务”接口(interface)。

我尝试将上下文实例化到我的存储库中,但是,当然,当我尝试新建一个服务实例时,它需要传入一个上下文对象。我尝试通过发送来解决它一个新的 BloggingContext() 作为上下文参数,但收到错误:No database provider has been configured for this DbContext. 这当然是有道理的,因为 new 一个我传入的那个没有到与之关联的数据库的连接。该连接是在 Startup.cs 中定义的,正如我正在学习的各种教程中所描述的那样,试图在此过渡中磨练自己。

那么,如果我的 Controller 中有以下代码,我如何才能调用该服务并仍然让依赖注入(inject)执行它在存储库级别设计的功能?

    [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 问题后穿过那座桥。

最佳答案

使用依赖注入(inject)来创建你的服务(我喜欢有一个接口(interface))-

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

您的安全服务可以注入(inject)上下文

private readonly BloggingContext _context;

public class SecurityService : ISecurityService
{
public SecurityService (BloggingContext context)
{
_context = context
}
}

您可以在 Startup.cs 中的 ConfigureServices 方法中注册您的服务:

service.AddScoped<ISecurityService, SercurityService>();

关于c# - 使用存储库模式实现依赖注入(inject)的混淆 - c# EF Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40965674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com