gpt4 book ai didi

c# - Entity Framework DbContext 未使用依赖注入(inject)进行处理

转载 作者:行者123 更新时间:2023-12-05 03:54:34 25 4
gpt4 key购买 nike

我在解决方案中有以下设置:

编辑:可以找到演示解决方案 here

ASP.NET 核心网络 API:

public class MyController : ControllerBase
{
private readonly IMyService _service;
public MyController(IMyService service)
{
_service = service;
}
}

服务层:

public class MyService: IMyService, IDisposable
{
private readonly IDataContext _context;
public MyService(IDataContext context)
{
_context = context;
}
}

Entity Framework 核心:

public class DataContext : DbContext, IDataContext, IDisposable
{
public DataContext(DbContextOptions<DataContext> options, IAuthenticationService authentication, ILogger<DataContext> logger) : base(options)
{
...
}
}

使用 Microsoft.Extensions.DependencyInjection 将它们链接在一起的“CompositionRoot”:

services.AddDbContext<DataContext>(options =>  options.UseSqlServer(configuration.GetConnectionString("myConnection")), ServiceLifetime.Transient);
services.AddTransient<IMyService, MyService>();
//EDIT: removed this line
//services.AddTransient<IDataContext, DataContext>();

这一切都按预期工作,但我的 DataContext 从未被处置。我已经在 dispose 方法中添加了日志来监视这种行为,但我无法弄清楚为什么会发生这种情况(或在这种情况下不会发生)。我试过了

  • 重新排序“AddTransient”但未成功(如预期)
  • 使用“AddScoped”而不是“AddTransient”

我在我的单元测试中使用一个接口(interface)来模拟 DbContext,但我希望我的 DbContext 被处理掉。有人知道为什么会发生这种情况以及如何解决吗?

编辑:一些额外的日志

  • 2020-03-24 21:09:29.5727|在 DataContext 中注入(inject)的选项
  • 2020-03-24 21:09:29.6064|在 DataContext 中注入(inject)身份验证
  • 2020-03-24 21:09:29.6064|在 DataContext 中注入(inject)记录器
  • 2020-03-24 21:09:29.6262|已创建 DataContext 1ddd98a1-a8f9-4096-8a11-c0b4d40d01ae
  • 2020-03-24 21:09:30.1918|在客户服务中注入(inject)记录器
  • 2020-03-24 21:09:30.2200|在 CustomerService 中注入(inject)的 DataContext
  • 2020-03-24 21:09:30.2300|在 CustomerService 中注入(inject)的映射器
  • 2020-03-24 21:09:30.2482|在 CustomerService 中注入(inject)身份验证
  • 2020-03-24 21:09:30.2482|创建客户服务 5b446267-d908-4291-9918-af1841324708
  • 2020-03-24 21:09:30.2769|在 CustomerController 中注入(inject)的记录器
  • 2020-03-24 21:09:30.2769|在 CustomerController 中注入(inject) CustomerService
  • 2020-03-24 21:09:30.3186|CustomerController.GetCustomer(4)
  • 2020-03-24 21:09:35.0599|配置 CustomerService 5b446267-d908-4291-9918-af1841324708

编辑 3 月 25 日:我试过在没有接口(interface)的情况下使用 DataContext,但问题仍然存在。我真的不知道我做错了什么!

最佳答案

您没有正确注册 DbContext

使用 AddDbContext 的以下重载

services.AddDbContext<IDataContext, DataContext>(options =>  
options.UseSqlServer(configuration.GetConnectionString("myConnection")));

它将接口(interface)/抽象与具体实现相关联。

并去除临时注册

services.AddTransient<IDataContext, DataContext>();

关于c# - Entity Framework DbContext 未使用依赖注入(inject)进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60838175/

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