.NET Core开发日志——Edge.js
最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中。这套正在开发的自动化工具使用的是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能够尽早到来。
下一篇: 设计模式之外观or门面模式
推荐阅读
-
详解.net core webapi 前后端开发分离后的配置和部署
-
.NET Core / C# 开发 IOT 嵌入式设备的个人见解
-
(14)ASP.NET Core 中的日志记录
-
详解.NET Core+Docker 开发微服务
-
简单谈谈.NET Core跨平台开发
-
Visual Studio 2017 ASP.NET Core开发
-
详解.net core webapi 前后端开发分离后的配置和部署
-
ASP.NET Core优雅的在开发环境保存机密(User Secrets)
-
.NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计
-
Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验