asp.net-core – 实体框架核心服务默认生命周期
在ASP.NET Core应用程序中,我可以像这样通过DI注册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的默认生命周期是作用域.这是这样的.
实例化DbContext非常便宜,它确保您不会使用许多资源.如果你有一个单身生命周期的DbContext,那么你读过的所有记录都会被DbContext跟踪,除非你专门禁用了跟踪.这将需要更多的内存使用,并将继续增长. DbContext跟踪的越多,性能就越低.这就是为什么你经常看到DbContext只在using(var context = new AppDbContext())块中使用. 但是,在Web应用程序中,使用using块是不好的,因为生命周期由framework管理,如果您将其处置为早期,则之后的调用将因异常而失败. 如果您在另一侧使用瞬态生命周期,则将失去“事务”功能.使用作用域,DbContext的事务范围与请求一样长. 如果你需要更细粒度的控制,你必须使用工作单元模式(DbContext已经使用了它). 对于你的第二个问题: 如果您创建服务,则其生命周期必须等于范围或更短的范围(读取:Scoped或瞬态). 如果您明确需要更长的服务生命周期,则应将DbContext工厂服务或工厂方法注入服务. 你可以用类似的东西来完成这个 services.AddTransient<Func<AppDbContext>>( (provider) => new Func<MyDbContext>( () => new AppDbContext())); services.AddSingleton<IMySingletonService,MySingletonService>(); 您的服务可能如下所示: public class MySingletonService : IMySingletonService,IDisposable { private readonly AppDbContext context; public MySingletonService(Func<AppDbContext> contextFactory) { if(contextFactory == null) throw new ArgumentNullException(nameof(contextFactory)); // it creates an transient factory,make sure to dispose it in `Dispose()` method. // Since it's member of the MySingletonService,it's lifetime // is effectively bound to it. context = contextFactory(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何将我的视图模型绑定到jqGrid
- kendo-ui – Kendo grid在最后一页,最后一行位置
- asp.net – 获取用户及其角色的列表
- asp.net – .NET PrivateFontCollection – 完成
- asp.net-mvc-3 – Glimpse.axd 403ing在IIS上
- asp.net-mvc-3 – 如何使用ASP.NET MVC 3“Razor
- asp.net – 在ListView中设置最后一项的样式
- asp.net – 实体框架Web配置文件
- asp.net-mvc – 没有值的asp.net mvc htmlattrib
- asp.net-mvc – 在ASP.NET MVC 3中路由静态文件,