无法从单例使用作用域服务MyDbContext-InvalidOperationException

时间:2018-08-12 05:48:14

标签: c# .net .net-core dbcontext

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

services.AddDbContext<DocumentContext>(options => options.UseSqlServer(connection));
services.AddSingleton<IAuthRepository, AuthRepository>();

IAuthRepository文件:

public interface IAuthRepository
{
    int Login(LoginRequest model);
    int Register(RegisterRequest model);
}

AuthRepository文件:

private readonly DocumentContext db;
public AuthRepository(DocumentContext context)
{
    this.db = context;
}
...

控制器:

private IAuthRepository AuthMethod { get; set; }
public AuthController(IAuthRepository authMethod)
{
    this.AuthMethod = authMethod;
}

我收到此错误

  

InvalidOperationException:无法使用单例“ ... IAuthRepository”中的作用域服务“ ... DocumentContext”。

1 个答案:

答案 0 :(得分:1)

嗯,这在asp.net核心中很常见,dotnetcoretutorials中有完整的文章:

  

...因为它实际上是ASP.net的服务DI   核心尝试确保您不会绊倒自己。虽然不是   万无一失(他们仍然会给您足够的绳索来挂住自己),   实际上试图阻止您犯下经典的DI范围错误。

最后的结论很简单:因为ChildService是作用域,而父亲服务是单例,因此不允许我们运行

  

...是瞬态,即“每次请求此服务时,请创建一个   新实例”,因此从技术上讲,这是正确的行为(即使   可能会引起问题)。而ASP.net中的“作用域”实例   核心是“每页请求一个新实例”,无法满足   当父母是单身时。