编写脚本以在程序中执行重复的业务任务

问题描述

我有以下类保存了一个任务的开始和结束值

public class WorkPackage
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime FromTime { get; set; }
    public DateTime ToTime { get; set; }
}

我也将保存的值显示如下(基于FromTime分组)

enter image description here

最终用户可以

  1. 通过拖放将一个 WorkPackage一个月移到另一个月。
  2. 根据某些规则将一个 WorkPackage 拆分为两个或多个 WorkPackage

所以我有以下方法

public void MoveWorkPackagetoMonth(WorkPackage wp,int month)
{
   ....
} 
public List<WorkPackage> SplitWorkPackage(WorkPackage wp)
{
   ....
} 

每次用户WorkPackage 列表进行大量更改,但出于业务原因,WorkPackage 列表可能每隔几天就会重建一次,并且用户希望在重新创建时执行相同的操作 -创建了 WorkPackage 列表,所以我需要将用户的作品保存在数据库中,以便在重新创建的 WorkPackage 列表上重复相同的作品。

我想添加一些类似脚本语言的东西来将用户作品保存为字符串,如下所示:

"Move(WP1){From(January) To(April)};SPLIT(WP5);"

有什么图书馆可以帮助我吗?或者我必须定义自己的自定义业务语言?(我使用了 .Net4

解决方法

NuGet 包 ITVComponents.Scripting.CScript 提供了一个支持解释和编译代码的脚本引擎。 语法源自 JavaScript,带有一些特殊的扩展,以启用动态类型加载和本机脚本部分。 不幸的是,目前没有文档,但我正在处理它..

基本上,对于您想要实现的目标,您可以使用以下代码:

ExpressionParser.ParseBlock(yourScript,yourObject,s => DefaultCallbacks.PrepareDefaultCallbacks(s.Scope,s.ReplSession));

其中 yourObject 将是实现方法 MoveWorkPackageToMonth 的对象, SplitWorkPackage,一种查找包(FindPackage?)和月份 als 整数属性的方法,您的脚本看起来像

MoveWorkPackageToMonth(FindPackage("nameOfPackage1"),April); MoveWorkPackageToMonth(FindPackage("nameOfPackage2"),February); ...

此代码将在解释后工作,因此,如果您要执行大量操作,它可能会很慢。