3

我有一个现有的 asp.net (c#) 应用程序。我需要为用户提供一种创建灵活规则的方法,以计算给定雇用日期和注册日期的生效日期。

可能使用的一些规则示例:

  1. 雇用日期或入学日期中的较晚者
  2. 雇用日期 + 90 天
  3. 注册日期后的第一个月的第一天
  4. 如果注册日期在当月 15 日之前,则生效日期为下个月 1 日。如果是 15 日或之后,则为之后的一个月 1 日。

我从一些偏移字段(日偏移、月偏移等)开始,但是当我遇到新的需求时,我开始意识到当前的方法不够灵活。

我想做的是允许最终用户定义一个函数,该函数返回给定两个参数(hiredate、enrollmentdate)的日期,并将该函数存储在数据库中。当我需要计算有效日期时,我会将此函数从数据库中拉出,执行它并传入参数以获取我的有效日期。

我需要(我认为)是允许创建此功能的领域特定语言(DSL)。它的语法必须允许轻松操作日期。

我正在寻找符合我要求的 DSL 建议。如果我的 DSL 策略不正确,请推荐另一条路径。谢谢你。

4

2 回答 2

1

我还没有见过这样的 DSL(而且我花了很多时间研究相关主题)。

允许用户指定日期/时间表达式是一个非常困难的问题。我自己的自然语言引擎可能是一个合适的起点或获得一些想法的好地方。

在那个引擎中,我有一个TemporalExpression. NLP 引擎可以解析像“去年五月下午 5 点之后的星期五”这样复杂的字符串,并为此创建一个准确的表达式树。如果你Abodit从 Nuget 中提取各种包,你可以探索围绕这个想法的类和方法。还有一些计量单位类,包括可能有帮助的时间间隔(TimeSpan例如,无法处理“1 个月零 2 天”)。

您可以扩展引擎以解析您自己的令牌(无论是简单的,如“雇用日期”,还是复杂的,如通过名称识别给定假期以创建新的TemporalExpression)。

您可能还想查看 DAML 和OWL-Time ,以了解有关在语义 Web 中表示时间表达式的想法。

免责声明:这是我写的,这是一个指向我网站的链接,它仍在进行中,即将推出一个带有“生产规则”和性能大幅提升的新版本,很高兴离线讨论,等等等等……

于 2013-02-01T23:11:22.390 回答
0

我目前正在使用逃逸表达式解析器来实现我的解决方案。这允许我使用 .NET DateTime 结构提供给我的大部分方法和属性。通过重新发布我的问题,我被指出了这个方向,如下所示:

https://stackoverflow.com/a/14730487/21155

于 2013-02-08T05:32:13.963 回答