【发布时间】:2019-03-24 16:14:30
【问题描述】:
我关注了一篇关于“使用 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>();
你会注意到:
(1) UseInMemoryDatabase 上 DbContext
(2)AddSingletonTodoRepository
这很好用。现在我更新了代码以将数据保存在真实数据库中。所以主要变化是:
services.AddDbContext<TodoContext> (options => options.UseSqlite("Data Source=blogging.db"));
services.AddSingleton<ITodoRepository, TodoRepository>();
我想通知我必须将 AspNetCore 从 1.0 迁移到 2.2。
现在在运行时,当定位控制器时,我收到错误:Cannot consume scoped service 'Models.TodoContext' from singleton 'Models.ITodoRepository'。
我明白在这种情况下:
我的
TodoContext是一个 Scoped 对象:在请求中相同,但在不同请求中不同。我的
TodoRepository是一个单例对象:每个对象和每个请求都相同。
所以我终于将AddSingleton 更改为AddScoped,效果很好:
services.AddDbContext<TodoContext> (options => options.UseSqlite("Data Source=blogging.db"));
services.AddScoped<ITodoRepository, TodoRepository>();
我的问题是:知道这是否是一种可接受的方法?
PS:我知道关于这个问题还有其他关于 SO 的问题,但我没有阅读明确的回复。
【问题讨论】:
-
不仅可以接受,而且非常可取。内存数据库是异常值。您希望存储库的范围仅限于请求,有时甚至更小。
标签: c# asp.net-core dependency-injection