当前位置: 移动技术网 > IT编程>开发语言>.net > .NET Core开发日志——Edge.js

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

2018年10月22日  | 移动技术网IT编程  | 我要评论

远古入侵国语,flash 9,叶选平女婿

最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中。这套正在开发的自动化工具使用的是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代码还未能处理javascript中可能发现的异常情况,比如在sayhello函数中加上一句抛出异常语句,代码在执行时则会发生预期中的错误。

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

因此更好地做法是在.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能够尽早到来。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网