CRON 服务功能的最佳方式
Best way to CRON a service function
我们有 .net 6 worker 服务。
在此 worker 中有一个注入的作用域 dbcontext 以及一个使用此上下文的注入服务。
服务看起来像这样:
Publc ServiceConstructor(Mycontext context)
{
_dbContext = context; <---- scoped injected db
}
Public async Task DoWork()
{
//Do Work
}
启动有:
services.AddScoped<Mycontext>();
services.AddScoped<Myservice>()
并且在我的工人的 ExcecuteAsync()
using(var scope = _serviceProvider.CreateScope()){
//get service here using getrequiredservice
}
我面临的问题是我需要使用 cron 安排 doWork。但也要记住,将添加第二个和第三个服务,其中两个将 运行 同时 运行 而第三个在不同的时间。不过三个都应该很容易设置新的时间。
是否有一种简单的方法来单独安排所有 3 个服务功能?
所有 3 个将使用相同的数据库。
这有点取决于您的型号;但总的来说:DbContext
应该是短暂的。
含义:
您不会在服务的生命周期内处理 DbContext
的同一个实例,而是:您必须请求一个新实例,最好是在函数执行时从框架中请求。
这与处理 HTTP 请求时的工作方式类似。根据请求,您将拥有“自己的”DbContext
。可以找到一个关于连接池如何在这种情况下工作的有趣问题 here, and an general article on how to retrieve the DbContext
can be found 。
总结一下:如果服务长期存在:不要像您那样将其注入构造函数,而是在每次 CRON 执行时解析它,这将在 ExcecuteAsync
中通过作用域服务提供商。
我需要更多代码才能更具体。至于现在,您似乎已经具备了所有的构建基块,应该能够找到解决方案。如果您还有其他问题,请告诉我。
我们有 .net 6 worker 服务。
在此 worker 中有一个注入的作用域 dbcontext 以及一个使用此上下文的注入服务。
服务看起来像这样:
Publc ServiceConstructor(Mycontext context)
{
_dbContext = context; <---- scoped injected db
}
Public async Task DoWork()
{
//Do Work
}
启动有:
services.AddScoped<Mycontext>();
services.AddScoped<Myservice>()
并且在我的工人的 ExcecuteAsync()
using(var scope = _serviceProvider.CreateScope()){
//get service here using getrequiredservice
}
我面临的问题是我需要使用 cron 安排 doWork。但也要记住,将添加第二个和第三个服务,其中两个将 运行 同时 运行 而第三个在不同的时间。不过三个都应该很容易设置新的时间。
是否有一种简单的方法来单独安排所有 3 个服务功能?
所有 3 个将使用相同的数据库。
这有点取决于您的型号;但总的来说:DbContext
应该是短暂的。
含义:
您不会在服务的生命周期内处理 DbContext
的同一个实例,而是:您必须请求一个新实例,最好是在函数执行时从框架中请求。
这与处理 HTTP 请求时的工作方式类似。根据请求,您将拥有“自己的”DbContext
。可以找到一个关于连接池如何在这种情况下工作的有趣问题 here, and an general article on how to retrieve the DbContext
can be found
总结一下:如果服务长期存在:不要像您那样将其注入构造函数,而是在每次 CRON 执行时解析它,这将在 ExcecuteAsync
中通过作用域服务提供商。
我需要更多代码才能更具体。至于现在,您似乎已经具备了所有的构建基块,应该能够找到解决方案。如果您还有其他问题,请告诉我。