通过接口注册/解析DbContext的正确方法是什么?
我有多个Web服务,每个Web服务都具有不同的dbcontext。
由于我需要在共享项目中编写一些通用功能,因此我编写了一个由每个dbcontext实现的接口,因此只需注入dbcontext接口,我就可以拥有一组共享功能“ dbcontext-implementation-agnostic”。 / p>
在每个项目中,每个dbcontext 已经由其实现使用并注入,但是我只想在公共功能项目中使用其接口。
因此,在每个Web服务中,我都会有类似的东西:
services.AddDbContext<IMyDbcontext, MyDbcontext>(options =>
{
options.UseSqlServer(configuration.GetConnectionString("MyDbContext"));
});
services.AddTransient<ISharedService, SharedService>();
并在共享项目中
public class SharedService : ISharedService
{
public SharedService(IMydbcontext context)
{
[...]
}
[...]
}
具有IMyDbcontext
就像
public interface IMyDbcontext
{
DbSet<SharedSettings> Settings { get; set; }
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default);
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
}
并且我需要Startup.cs中的ISharedService-Configure()with
app.ApplicationServices.GetService<ISharedService>();
我一直在谷歌上搜索很多次,尝试了不同的方法,但是我找不到能起作用的方法...
我尝试使用转发器,例如:(如建议here)
services.AddDbContext<MyDbContext>();
services.AddScoped<IMyDbContext>(provider => provider.GetRequiredService<MyDbContext>());
但是,尽管我没有解决具体的MyDbContext
的问题,但每当尝试解决IMyDbContext
时都会遇到此错误
System.InvalidOperationException:'无法解决 来自根提供商的“ Blah.IMyService”,因为它 需要范围服务 “ Blah.IMydbcontext”。
其中IMyService
已注册为临时地址,其实现构造函数为
public MyService(IMydbcontext context)
我也试图像这样注册dbcontext
services.AddDbContext<IMyDbContext, MyDbContext>();
但是后来,当我尝试解决MyDbContext
时,我得到了null
,我不明白为什么
答案 0 :(得分:0)
IMyService
需要一个范围为IMyDbContext
的范围,但在您的 没有范围的启动Configure()方法。您可以将
IDbContext
设置为瞬态(如果可以接受, 你)。或者,您可以尝试使用
CreateScope()
方法,然后从该新作用域获取IMyService 提供者。
因此,我使用IServiceScopeFactory创建了一个作用域,并且成功了
var scopeFactory = app.ApplicationServices.GetService<IServiceScopeFactory>();
using var scope = scopeFactory.CreateScope();
var myService = scope.ServiceProvider.GetService<IMyService>();