生命周期范围在Application_Start中意味着什么

问题描述 投票:0回答:1

当我将具有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

asp.net-mvc dependency-injection autofac
1个回答
1
投票

资源将在您的情况下放置一个范围,它是应用程序范围,因此在应用程序停止时将释放资源。

在这种情况下,我会使用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;
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.