我正在尝试构建类似 airbnb 的东西。当用户预订公寓时,我想将该公寓封锁 30 分钟。如果用户不付款,系统应该从 readyForReserve 表中删除该公寓的区块。
我的问题是我应该如何检查住宅是否完成了 30 分钟的等待,并且应该从阻止列表中删除?
(顺便说一句-我的数据库是 ssms,我使用 efcore 和 linq)
如何在 30 分钟后更新数据库表?
我找到了
backgroundService
和delay
,但我不确定这些是否正确
您应该编写一个工作者服务(使用项目的“WorkerService”模板)并通过更改解决方案属性将其添加到您的启动项目中。
我会在这里为你放工人示例代码: 程序.cs
using WorkerService;
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
})
.Build();
host.Run();
Worker.cs
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1800000/*30 minutes as milliseconds*/, stoppingToken);
var reservedItesm = new List<object>(); //change this with your list of saved items
foreach (var reservedItem in reservedItesm)
{
reservedItem.IsLocked = false;
//update your repository for each item here.
}
}
}
}
我找到了backgroundService和delay,但是我不确定这些是不是正确的方式
是的,如果您运行一个或多个服务器实例,您应该使用
backgroundService
如果你只有一个服务器实例,你可以使用托管服务
方法:
下订单后锁定公寓资源,排队延迟作业以在 30 分钟后释放此锁定
设置周期任务释放所有公寓资源锁超过30分钟
你不需要经常更新你的表格。只需在预订上设置到期时间(或创建时间并据此计算)。
例如:
class Reservation
{
[Key]
public int ReservationId {get; set;}
public Room Room {get; set;}
public DateOnly StartDate {get; set;}
public DateOnly EndDate {get; set;}
public DateTime ExpiryTime {get; set;}
public bool Paid {get; set;}
}
然后当预订房间时,您可以将
ExpiryTime
设置为半小时的时间。付款后,您可以将其设置为更高的日期。
然后可以按到期日查询可预订
if (someRoom.Reservations.Any(r =>
r.StartDate < endDate &&
r.EndDate > startDate &&
r.ExpiryTime > DateTime.UtcNow))
{
throw new Exception("Room already reserved");
}
重点是,任何已过期的预订都将被忽略。不需要在后台更新表。