通过EFCore 3中的接口解析DbContext

通过接口注册/解析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,我不明白为什么

wintin98 回答:通过EFCore 3中的接口解析DbContext

/u/AngularBeginner指出:

  

IMyService需要一个范围为IMyDbContext的范围,但在您的   没有范围的启动Configure()方法。

     

您可以将IDbContext设置为瞬态(如果可以接受,   你)。

     

或者,您可以尝试使用   CreateScope()方法,然后从该新作用域获取IMyService   提供者。

Source

因此,我使用IServiceScopeFactory创建了一个作用域,并且成功了

var scopeFactory = app.ApplicationServices.GetService<IServiceScopeFactory>();   
using var scope = scopeFactory.CreateScope();
var myService = scope.ServiceProvider.GetService<IMyService>();
本文链接:https://www.f2er.com/2963907.html

大家都在问