我有一个解决方案的设置如下:
编辑:演示解决方案可以在此处找到这里
ASP.NET Core Web 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 Core:
public class DataContext : DbContext, IDataContext, IDisposable
{
public DataContext(DbContextOptions<DataContext> options, IAuthenticationService authentication, ILogger<DataContext> logger) : base(options)
{
...
}
}
使用 Microsoft.Extensions.DependencyInjection 的“组合根”将所有内容链接起来:
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”。我在单元测试中使用接口来模拟DbContext,但我也希望我的DbContext能够被销毁。 有人知道为什么会出现这种情况以及如何解决吗? 编辑:一些额外的日志 Options注入到DataContext中 身份验证注入到DataContext中 记录器注入到DataContext中 创建DataContext 1ddd98a1-a8f9-4096-8a11-c0b4d40d01ae 记录器注入到CustomerService中 将DataContext注入到CustomerService中 将Mapper注入到CustomerService中 身份验证注入到CustomerService中 创建CustomerService 5b446267-d908-4291-9918-af1841324708 记录器注入到CustomerController中 将CustomerService注入到CustomerController中 CustomerController.GetCustomer(4) 处置CustomerService 5b446267-d908-4291-9918-af1841324708 编辑3月25日: 我尝试了使用没有接口的DataContext,但问题仍然存在。我真的不知道我做错了什么!