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

将 Context Ef core 注入到 Worker Service 项目

如何解决将 Context Ef core 注入到 Worker Service 项目

我想将我的内容注入到项目中并在工作人员中使用上下文:

public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext,services) =>
                {
                    services.AddDbContext<XContext>(options =>
                    {
                        options.UsesqlServer(
                            hostContext.Configuration["ConnectionStrings:Connection"],serverDbContextOptionsBuilder =>
                            {
                                var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds;
                                serverDbContextOptionsBuilder.CommandTimeout(minutes);
                                serverDbContextOptionsBuilder.EnableRetryOnFailure();
                            });
                    });
                    //services.AddTransient<XContext>();
                    //services.AddTransient<XContext>();
                    services.AddScoped<XContext>();

                    //workers
                    services.AddHostedService<Worker1>();
                    services.AddHostedService<Worker2>();
                });
    }

工人:

     public class Worker1: BackgroundService
        {
            private readonly ILogger<Worker1> _logger;
    
            private readonly IConfiguration _configuration;
    
            private readonly TookoContext _uow;
    
             
    
            public Worker1(ILogger<Worker1> logger,IConfiguration configuration,XContext uow)
            {
                _logger = logger;
                _configuration = configuration;
                _uow = uow;
            }
   // ...
}

我有这个错误

某些服务无法构建(验证时出错> 服务描述符 ServiceType: Microsoft.Extensions.Hosting.IHostedService 生命周期:单例 实施类型:Worker1':无法使用范围服务 'XContext' 来自单身

解决方法

您需要将 IServiceProvider 注入托管服务,然后在需要 XContext 时:

using (var scope = _serviceProvider.CreateScope())
{
    var context = scope.GetRequiredService<XContext>();
    // ...
}

DBContext 旨在是短暂的,所以不要试图在您的服务启动时创建一个并在服务的生命周期内保留它。相反,您应该在需要时创建、简要使用,然后处理它们。

在上面的例子中,作用域将处理上下文;你不需要 - 也不应该 - 自己做。

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