在ASP.NET Core应用程序中,我可以通过依赖注入来注册DbContext,如下所示。
services.AddDbContext<Models.ShellDbContext>(options => options.UseNpgsql(connection));
了解它的生命周期是很有趣的,那么它的生命周期是什么呢?
从这里 https://github.com/aspnet/EntityFramework/blob/f33b76c0a070d08a191d67c09650f52c26e34052/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L140 看起来像是配置为Scoped,这意味着在每个请求上创建一个DbContext实例。
因此问题的第一部分是: 这是真的吗?如果是,那么成本高吗?
第二部分是: 如果我创建了一个使用DbContext的服务,并且旨在被控制器使用,并且将具有管理DB中某些实体的API,那么应该将其注册为Scoped吗?
CreateController
方法中有一个控制器工厂(IControllerFactory
,请参见https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/Controllers/DefaultControllerFactory.cs的默认实现),它创建控制器并在`ReleaseController()`方法中处理控制器及其依赖项的释放。此外,请参阅此GitHub问题以获取更多详细信息和为什么以这种方式工作:https://github.com/aspnet/Mvc/issues/3727 - TsengDbContext
,则不需要将其释放。请注意,在我的答案中,我传递了一个委托Func<AppDbContext> contextFactory
,其中委托在每次调用时创建工厂的新实例。 - Tseng