Ckrule的规则包调用形式一直被很多朋友诟病,如CKRuleAdm文件夹,很多朋友都认为是没有必要或要修改名称的,因为这个内容只能放在服务端,如果放在客户端,就很碍眼,那有没有更好的调用接口呢,如直接读数据库呢?另一个问题是,商业许可的license,能不能不放在根目录下,直接传参数进CKRule是更方便的方法,也是比较适合部署的。这将大大提高部署的灵活性,更具商业特性。

    最近版本(1.1.9)的Ckrule已经解决了这些问题,这对于商业使用的用户来说,是一个福音,主要体现在如下3点:
    1,可以更加灵活地保存规则文件,执行规则时动态传入对象。
    2,商业license的文件内容也可以动态传入,不必放在本地目录中。
    3,数据库访问接口也完全对外提供了。
    请关注下面代码中的InitExtendAPI接口:
            var _adminAccess = new AdminDataAccess();
            ExtendAPI _ext = new ExtendAPI();
            _ext.AdminDataAccess = _adminAccess;
            _ext.DBHandlerInstance = new DBHandler();
            _ext.LicenceInstance = _adminAccess;
            //初始化RuleFacade
            RuleFacade _inst = new RuleFacade();
            _inst.InitExtendAPI(_ext);
    在例子中,ExtendAPI类,定义了三个属性,AdminDataAccess,DBHanderInstance和LicenceInstance,顾名思义可知一二:
    1,AdminDataAccess是用于读取规则包的接口。
    2,DBHanderInstance是数据库访问的接口。
    3,LicenceInstance是商业许可的接口。
    下面,我们再详细看看ExtendAPI类的这三个属性:
    // Summary:
    //     扩展接口
    public class ExtendAPI
    {
        public ExtendAPI();
 
        // Summary:
        //     管理数据访问器
        public IAdminDataAccess AdminDataAccess { get; set; }
        //
        // Summary:
        //     数据库访问器实例
        public IDBHandler DBHandlerInstance { get; set; }
        //
        // Summary:
        //     获取授权证书
        public ILicence LicenceInstance { get; set; }
    }
    三个属性分别对应三个不同的接口,在实现的这些接口时,是可以使用一个类,也可以使用不同的类,下面是三个接口的定义。
    IAdminDataAccess主要用于规则包的读取与保存,规则调用时,并不使用保存接口,只会使用读取接口。实现了读取接口后,可以将包文件保存在数据库之中,也可以另存到其他地方。
    保存接口之所以存在,就是用来实现规则包的保存功能的,当ckrule的编辑界面直接由其他程序调用时,这个接口就要使用了,当用户在IDE界面点击了保存按钮之后就会调用这个保存接口。

    // Summary:
    //     管理数据持久化
    public interface IAdminDataAccess
    {
        // Summary:
        //     获取工程信息
        //
        // Parameters:
        //   pkgName:
        PackageDef GetPackage(string pkgName);
        //
        // Summary:
        //     保存工程信息
        //
        // Parameters:
        //   curPackage:
        //
        //   isSaveAs:
        void SavePackage(PackageDef curPackage, bool isSaveAs);
    }
    
    IDBHandler是数据库操作接口,包括多SQL操作,事件,存储过程调用等等。由于接口的实现是由软件开发商编写的,使用什么样的数据库都是可以的。不过CkRule并不推荐使用过多的Sql,而更加建议使用将业务封装为方法,编译成dll,再由CKRule调用。
    当您确实需要使用下面的接口时,请自定义一个类,实现如下的接口,而数据库的操作,可以直接使用ado.net或用其他的组件,如微软企业库之类。使用IDBHandler实例后,就不需要IDE的系统设置-数据库接口中设置了。         
    // Summary:
    //     数据库操作接口
    public interface IDBHandler
    {
        // Summary:
        //     开始数据库事务。
        IDbTransaction BeginTransaction();
        //
        // Summary:
        //     执行数据更新操作,返回影响数据的行数
        //
        // Parameters:
        //   sqlWrapper:
        int Execute(SqlWrapper sqlWrapper);
        //
        // Summary:
        //     执行数据更新操作,返回影响数据的行数
        //
        // Parameters:
        //   sql:
        int Execute(string sql);
        //
        // Summary:
        //     执行任意参数并返回结果。
        //
        // Parameters:
        //   parameters:
        object Invoke(params object[] parameters);
        //
        // Summary:
        //     创建新的Id,以tableName为参数。
        //
        // Parameters:
        //   tableName:
        //
        //   parameters:
        //
        //   tag:
        string NewId(string tableName, SqlParams parameters, object tag);
        //
        // Summary:
        //     创建新的Id,以tableName为参数。
        //
        // Parameters:
        //   tableName:
        //
        //   count:
        //
        //   parameters:
        //
        //   tag:
        List<string> NewId(string tableName, int count, SqlParams parameters, object tag);
        //
        // Summary:
        //     使用自定义Sql,传入相关变量,返回ExpressTable
        //
        // Parameters:
        //   sqlWrapper:
        DataTable Query(SqlWrapper sqlWrapper);
        //
        // Summary:
        //     使用自定义Sql,传入相关变量,返回DataTable
        //
        // Parameters:
        //   sql:
        //
        //   parameters:
        DataTable Query(string sql, params object[] parameters);
        //
        // Summary:
        //     更新Sql集合。
        //
        // Parameters:
        //   sqlWrappers:
        //
        //   tag:
        List<SqlWrapper> UpdateEntities(List<SqlWrapper> sqlWrappers, object tag);
    }
 
 
    商业证书读取接口,只有一个方法,用于获取商业使用的授权证书。
    // Summary:
    //     获取授权证书
    public interface ILicence
    {
        // Summary:
        //     获取授权证书
        string GetLicenceText();
    }
 
    备注: * 程序用于商业使用时,一定要使用商业证书,因为免费使用时程序持续运行的时间是受限制的。
    RuleFacade的高级接口,可以大大扩展了Ckrule的灵活性,如ckbrms中就使用了这些高级接口。
    


中文版 | 英文版 ©2014 Ckrule规则引擎 版权所有