示例:
我有一类抽象请求:
public enum RequestStatus
{
Active,
Cancelled,
Expired
}
public class SomethingRequest
{
public RequestStatus Status { get; set; }
public DateTime Expires { get; set; }
...
}
我偶然发现的问题:
示例:
现在时间:2021年9月13日 09:56 (次日到期)
状态 | 过期 |
---|---|
活跃 | 14/09/2021 09:56 |
当然,1天后检查请求是否过期的唯一方法是对照当前时间进行检查,但状态仍将是“Active”
如果“Expires”字段确定过期,如何将请求状态更改为“Expired”?
或者也许我选择了错误的方法来执行此操作并且不需要将“过期”状态存储在枚举中?最方便的方法是什么?
您有几种方法可以解决这个问题。
一个是定期运行作业(例如每小时一次),它搜索并更新数据库中的所有此类条目。但这仅与它运行的频率(例如 1 小时)一样准确,并且您可能不想运行得太频繁,否则随着表变大,可能会导致性能问题。
某些数据库支持生存时间 (TTL) 功能(例如 Mongo 和许多 Web 服务数据库)。然而,这通常会使整个记录/文档无效并在那时将其删除。这可能无法满足您的要求,而且该功能在 RDBMS 中并不常见(如果有的话?)
另一种方法是不直接将状态存储在数据库中,而只存储到期日期和一个布尔值(如果取消)。 然后,它是业务逻辑的一部分,用于根据到期日期确定实体的状态。
那么你的类可能看起来像这样。
public class SomethingRequest
{
public RequestStatus Status { get { return IsCancelled ? RequestStatus.Cancelled : Expires > DateTime.Now ? RequestStatus.Expired : RequestStatus.Active; } }
public DateTime Expires { get; set; }
private bool IsCancelled { get; set; } //Store cancelled state here
}
在检查请求时添加验证以检查过期时间,如果请求过期则调用助手更新状态。