无法从单例使用范围服务 MyDbContext - InvalidOperationException

Poo*_*ghy 3 .net c# dbcontext .net-core

我的项目是 .net core 2 base,我在 startup.cs 文件中设置了上下文和存储库

services.AddDbContext<DocumentContext>(options => options.UseSqlServer(connection));
services.AddSingleton<IAuthRepository, AuthRepository>();
Run Code Online (Sandbox Code Playgroud)

IAuthRepository 文件:

public interface IAuthRepository
{
    int Login(LoginRequest model);
    int Register(RegisterRequest model);
}
Run Code Online (Sandbox Code Playgroud)

AuthRepository 文件:

private readonly DocumentContext db;
public AuthRepository(DocumentContext context)
{
    this.db = context;
}
...
Run Code Online (Sandbox Code Playgroud)

控制器:

private IAuthRepository AuthMethod { get; set; }
public AuthController(IAuthRepository authMethod)
{
    this.AuthMethod = authMethod;
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

InvalidOperationException:无法使用来自单例“...IAuthRepository”的范围服务“...DocumentContext”。

Bar*_*r J 5

嗯,这在 asp.net core 中很常见,在dotnetcoretutorials 中有一篇关于它的完整文章:

...因为它实际上是 ASP.net Core 的服务 DI 试图确保您不会绊倒自己。虽然它不是万无一失(他们仍然给你足够的绳子让你上吊),但它实际上是在试图阻止你犯经典的 DI 范围错误。

最后的结论很简单:因为 ChildService 是有作用域的,而 FatherService 是单例的,它不会允许我们运行

...是瞬态是“每次请求此服务时,创建一个新实例”,所以从技术上讲,这是正确的行为(即使它可能会导致问题)。而 ASP.net Core 中的“作用域”实例是“每个页面请求的一个新实例”,当父对象为单例时无法实现。