无法使用单例 yyy 中的作用域服务 xxx

Bro*_*ato 5 c# dependency-injection asp.net-core

我关注了一篇博客文章“使用 ASP.NET Core 和 Visual Studio Code 构建您的第一个 Web API”。

http://www.codingflow.net/building-your-first-web-api-with-asp-net-core-and-visual-studio-code/

在这种情况下,数据不会保存在数据库中,而是保存在内存中,如下所示:

services.AddDbContext<TodoContext>(options => options.UseInMemoryDatabase());
services.AddSingleton<ITodoRepository, TodoRepository>();
Run Code Online (Sandbox Code Playgroud)

你会注意到:

(1)UseInMemoryDatabaseDbContext

(2)AddSingleton关于TodoRepository

这效果非常好。现在我更新了代码以将数据保存在真实的数据库中。所以主要的变化是:

services.AddDbContext<TodoContext> (options => options.UseSqlite("Data Source=blogging.db"));            
services.AddSingleton<ITodoRepository, TodoRepository>();
Run Code Online (Sandbox Code Playgroud)

我想通知您,我必须AspNetCore从 1.0 迁移到 2.2。

现在在运行时,当瞄准控制器时,我收到错误:无法使用单例“Models.ITodoRepository”中的作用域服务“Models.TodoContext”。

我理解在这种情况下:

  • MyTodoContext是一个 Scoped 对象:在一个请求中是相同的,但在不同的请求中是不同的。

  • MyTodoRepository是一个 Singleton 对象:对于每个对象和每个请求都是相同的。

所以我最后改成了AddSingleton效果AddScoped很好的:

services.AddDbContext<TodoContext> (options => options.UseSqlite("Data Source=blogging.db"));            
services.AddScoped<ITodoRepository, TodoRepository>();
Run Code Online (Sandbox Code Playgroud)

我的问题是:知道这是否是一种可以接受的方法?

PS:我知道关于这个问题还有其他问题,但我没有阅读明确的答复。

Das*_*are -1

对于你的问题,是的,这是做事的正确方法。

我想以更好的方式总结答案,但后来我对这个主题做了一些研究,我发现了一篇文章处理像你问的问题。

我建议您看一下这篇文章,因为它有关于如何解决某些问题的“最佳实践”部分。