欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET Core开发日志——Edge.js

程序员文章站 2022-08-09 17:57:41
最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中。这套正在开发的自动化工具使用的是C 语言,而旧有系统的业务逻辑则是使用AngularJS在前端构建而成。所以最初的考虑中有两个解决方案,一是将原有JavaScript代码改写成C 代码,以便集成;二是将所需代码抽离后 ......

最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中。这套正在开发的自动化工具使用的是c#语言,而旧有系统的业务逻辑则是使用angularjs在前端构建而成。所以最初的考虑中有两个解决方案,一是将原有javascript代码改写成c#代码,以便集成;二是将所需代码抽离后将它们放置在通过node.js搭建的restful api里,再在c#代码中以httpclient调用之。

但是之后发现了edge.js这一有趣的类库,于是又多了一项选择。

edge.js的作用在于连通node.js与.net两个世界。通过其开发者能够在node.js进程中调用.net代码或者在.net进程中调用node.js代码。

根据需求,这里是要用到在c#代码里调用node.js,即javascript代码。

想要了解如何使用该类库,可以从上的例子入手:

class program
{
    static void main(string[] args)
    {
        var func = edge.func(@"
            return function (data, callback) {
                callback(null, 'node.js welcomes ' + data);
            }
        ");

        console.writeline(func(".net").result);
        console.read();
    }
}

首先,需要通过nuget引入它的类库,install-package edge.js

然后,使用edgejs中edge类的func静态方法。该方法需要传入node.js中使用的代码,并且必须返回一个javascript函数。该函数有一个用于外部传入数据的参数,以及一个回调函数参数。此回调函数中的第一个参数为javascript中的异常信息,第二个是返回值。

edge.func方法返回的是func<object,task<object>>委托对象,意味着在.net可以以异步的方式处理返回内容。

接下来,看一下接近实际工程的例子。

以下的代码是angularjs中的常用写法。现在的计划是要把其中sayhello函数的逻辑放到c#代码中调用。

app.controller('myctrl', function($scope) {
    $scope.name = "world";
    $scope.sayhello = function(data) {
        $scope.greeting = 'hello ' + $scope.name + ' ' + data + '!';
    };
});

第一步要解决的是要考虑如何处理$scope。因为其本质上是一个对象,那么就将其定义为一个全局对象变量即可。

第二步是把核心代码移入edge的func方法参数中。

var func = edge.func(@"
    var $scope = {};

    $scope.name = 'world';
    $scope.sayhello = function(data) {
        $scope.greeting = 'hello ' + $scope.name + ' ' + data + '!';
    };
");

第三步加入返回方法并对javascript代码中可能出现的异常作捕获处理。

var func = edge.func(@"
    var $scope = {};

    $scope.name = 'world';
    $scope.sayhello = function(data) {
        $scope.greeting = 'hello ' + $scope.name + ' ' + data + '!';
    };

    return function (data, callback) {
        var exception = null;
        try {
            $scope.sayhello(data);    
        } catch(err) {
            exception = err;
        }
        callback(exception, $scope.greeting);
    }
");

运行完整代码能夠得到预期的结果。

class program
{
    static void main(string[] args)
    {
        var func = edge.func(@"
            var $scope = {};

            $scope.name = 'world';
            $scope.sayhello = function(data) {
                $scope.greeting = 'hello ' + $scope.name + ' ' + data + '!';
            };

            return function (data, callback) {
                var exception = null;
                try {
                    $scope.sayhello(data);    
                } catch(err) {
                    exception = err;
                }
                callback(exception, $scope.greeting);
            }
        ");

        console.writeline(func(".net").result);
        console.read();
    }
}

.NET Core开发日志——Edge.js

不过上述.net代码还未能处理javascript中可能发现的异常情况,比如在sayhello函数中加上一句抛出异常语句,代码在执行时则会发生预期中的错误。

$scope.sayhello = function(data) {
    $scope.greeting = 'hello ' + $scope.name + ' ' + data + '!';
    throw 'there is an error!';
};

.NET Core开发日志——Edge.js

因此更好地做法是在.net代码里也加上相应的异常处理。

class program
{
    static void main(string[] args)
    {
        try
        {
            var func = edge.func(@"
                var $scope = {};

                $scope.name = 'world';
                $scope.sayhello = function(data) {
                    $scope.greeting = 'hello ' + $scope.name + ' ' + data + '!';
                    throw 'there is an error!';
                };

                return function (data, callback) {
                    var exception = null;
                    try {
                        $scope.sayhello(data);    
                    } catch(err) {
                        exception = err;
                    }
                    callback(exception, $scope.greeting);
                }
            ");
            console.writeline(func(".net").result);
        }
        catch (exception ex)
        {
            // 处理异常
        }

        console.read();
    }
}

使用这种方法比直接翻译javascript代码的解决方案要更加节省工时,而且可以避免很多在翻译语言过程中可能会产生的bug。而与第二种建立node.js restful api的方式相比,又少了额外布署服务的工作。所以综合考虑下来,是十分适合实际需求的一种方案。

唯一令人遗憾的是,edge.js目前在.net代码调用node.js代码方面还不支持.net core。希望官网所述的coming soon能够尽早到来。
.NET Core开发日志——Edge.js