微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

System.ObjectDisposedException: '无法访问已处理的对象对象名称:'IServiceProvider' Startup.cs > 配置()主控制器发起DI主控制器使用DI

如何解决System.ObjectDisposedException: '无法访问已处理的对象对象名称:'IServiceProvider' Startup.cs > 配置()主控制器发起DI主控制器使用DI

我在 .NET Core 2.1 中使用依赖注入。应用程序按预期工作,只是在一段时间后 IServiceprovider 容器本身被释放并返回 System.ObjectdisposedException: Cannot access a disposed object.\r\nObject name: 'IServiceProvider'. 当这种情况发生时非常随机

Startup.cs > 配置()

public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(30);
            options.Cookie.HttpOnly = true;
        });

        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{Environment.EnvironmentName}.json",optional: false)
            .AddEnvironmentvariables()
            .Build();

        if (Environment.IsEnvironment("Local"))
        {
            Configuration[$"AppSettings:BasicSymmetricEncryptionKey"] = "XXXXXXX";
        }

        // Todo: Inject scheduler here? services.AddSingleton<IScheduler,DefaultScheduler>();
        services.AddSingleton(configuration);
        var connectionString = configuration.GetConnectionString("BitswapDatabaseContext");

        services.AddDbContext<BitswapDatabaseContext>(options =>
            options.UsesqlServer(connectionString));

        services.AddSingleton<ISystemInfo,LocalSystem>();
        services.AddSingleton<ITokenGenerator<Guid>,GuidTokenSource>();
        services.AddSingleton<IShoppingService,ShoppingService>();
        services.AddSingleton<IEventLogger,LoggerService>();
        services.AddSingleton<System.Reactive.Concurrency.IScheduler>(Scheduler.Default);
        services.AddSingleton<IAccounting,Accounting>();
        services.AddSingleton<IPaymentService,PaymentService>();
        services.AddSingleton<ICardsupplierResolver,CardsupplierResolver>();

        services.AddScoped<iqrCodeService,QRaftClient>();
        services.AddScoped<IMailService,SendGridMailer>();
        services.AddScoped<IEmailVerifier,EmailVerifier>();
        services.AddScoped<IUserService,UserService>();
        services.AddScoped<IBlockChain,TestBlockChain>(); // TO DO: don't use test blockChain
    }

主控制器(发起DI)

private readonly IServiceProvider _serviceProvider;

public Session(IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
}

主控制器(使用DI)

这是我访问 _serviceProvider 并得到已处理错误的地方:

using (var scope = _serviceProvider.CreateScope())
{
            var database = scope.ServiceProvider.GetrequiredService<BitswapDatabaseContext>();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。