この問題を解決する方法は、各ルールの開始/終了時刻を含む DateConstraint をオーバーライドする 3 つのテーブル (年間通算日、曜日、および絶対日付) を用意することでした。
検証コードは比較的単純でした。Matches() ルーチンをすべてのクラスに追加しました。
public partial class DateConstraint
{
public virtual bool Matches()
{
return DateTime.Now.TimeOfDay.Ticks >= StartTime.Ticks && DateTime.Now.TimeOfDay.Ticks <= EndTime.Ticks;
}
}
public partial class DayOfWeekConstraint : DateConstraint
{
public override bool Matches()
{
return base.Matches() && this.DayOfWeek == Convert.ToInt16(DateTime.Now.DayOfWeek);
}
}
public partial class DayOfYearConstraint : DateConstraint
{
public override bool Matches()
{
return base.Matches() && Date.Day == DateTime.Now.Day && Date.Month == DateTime.Now.Month;
}
}
public partial class AbsoluteDateConstraint : DateConstraint
{
public override bool Matches()
{
return base.Matches() && Date.Day == DateTime.Now.Day && Date.Month == DateTime.Now.Month && Date.Year == DateTime.Now.Year;
}
}
検証を行うには、単純に行います
foreach(var dateConstraint in Restaurant.DateConstraints)
{
if(!dateConstraint.Matches()) { return false; }
}