首页 问答 .NET: app.Lifetime.ApplicationStopping.Register 中的依赖注入问题
问题详情

Program.cs 中下面的代码

app.Lifetime.ApplicationStopping.Register(async () =>
{
    await app.Services.GetRequiredService<IRedisDatabase>().RemoveAsync(blogPostCacheKey);
    await app.Services.GetRequiredService<IRedisClientFactory>()
        .GetRedisClient("redis-postbody")
        .GetDbFromConfiguration()
        .RemoveAsync(postBodyCacheKey);
});

在运行时会报错,错误信息如下

The active test run was aborted. Reason: Test host process crashed : Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'IServiceProvider'.
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException()
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)

请问如何解决这个问题?

回答

app.Lifetime.ApplicationStopping.Register(async () 不要异步. 它接受的是一个action. 内部callback 这个action的时候不会判断是不是返回了Task, 要不要await.

app.Lifetime.ApplicationStopping.Register( ()=>{

….RemoveAsync().GetAwaiter().GetResult(); 差不多这样子.

})

或者
await app.RunAsync()
// cleanup
await app.Service…..RemoveAsync(); 这样也行. 只要app没有dispose, 就都能用.

版权:言论仅代表个人观点,不代表官方立场。转载请注明出处:https://www.stntk.com/question/218.html

发表评论
暂无评论

还没有评论呢,快来抢沙发~

点击联系客服

在线时间:8:00-16:00

客服QQ

70068002

客服电话

400-888-8888

客服邮箱

70068002@qq.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站