当我将具有Autofac的DbContext
配置为“生命周期范围”时,则在请求的范围内,这意味着它在请求结束时被丢弃。
但是当我们在MVC应用程序的DbContext
方法中从容器中获取Application_Start()
时会发生什么?
我们有一个设置为单例的设置类:
builder.RegisterType<Settings>().As<ISettings>().SingleInstance();
在Application_Start()
中,我们从容器中获取设置:
var settings = DependencyResolver.Current.GetService<ISettings>();
Settings类依赖于DbContext
- 并且DbContext
在生命周期范围内设置
我们知道这是一个captive dependency,但不认为这是一个问题,因为该类仅使用上下文一次。
我担心的是DbContext
是否会释放其资源。
在Application_Start()
,我们是在请求范围内还是我们在申请范围内?
如果我们在应用程序的范围内,“生命范围”意味着我们不会在应用程序停止之前处置DbContext
?
资源将在您的情况下放置一个范围,它是应用程序范围,因此在应用程序停止时将释放资源。
在这种情况下,我会使用Func<Owned<DbContext>>
,类似的东西:
public class Settings
{
Settings(Func<Owned<DbContext>> contextFactory)
{
this._contextFactory = contextFactory;
}
private readonly Object _lock = new Object();
private readonly Func<Owned<DbContext>> _contextFactory;
private Boolean _isSettingsLoaded = true;
private Int32 _settingsA;
public Int32 SettingsA
{
get
{
this.EnsureSettingsLoaded();
return _settingsA;
}
}
private void EnsureSettingsLoaded()
{
if (!this._isSettingsLoaded)
{
lock (this._lock)
{
if (!this._isSettingsLoaded)
{
using (Owned<DbContext> context = this._contextFactory())
{
// context.Value.DoSomething();
}
this._isSettingsLoaded = true;
}
}
}
}
}