最近在项目中碰到如许的需求:要将旧有体系的一部分营业逻辑集成到新的自动化流程东西中。这套正在开辟的自动化东西运用的是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可以尽早到来。
以上就是浅谈.NET Core开辟日记中Edge.js是什么?怎样用?的细致内容,更多请关注ki4网别的相干文章!