简介

历史的车轮在不断的向前推进,NCF也在不断的迭代更新,只为成为更好的NCF

如果你之前没有用过NCF可以跳过这个文档,直接去下载最新的NCF源码进行实践。

NCF仓库地址:https://github.com/NeuCharFramework/NCF

如果你之前已经用过NCF,那么一定了解Xncf Module是啥了,那么就需要用到今天要说的内容了

在开始说之前呢,先来回顾一下,这个功能主要用在什么地方的

下图就是

这些功能原本是放在Xncf的Function里面的

更新到最新版以后,就没有Function了,更加深层次的DDD化了,所以采用了FunctionRender的方式

步骤

1.先建立对应的文件夹及文件

2.将原来Function里面的方法放入到AppService中

3.建立对应的参数的内容

4.将原来需要调用和触发方法的地方修改

5.将入口文件Register中使用到Function的地方去掉

6.将Function及下面对应的文件删除

7.更新Xncf Module的发布版本

8.重新发布

实施

1.先建立对应的文件夹及文件

建立ACL -> Port

> 概念ACL (Anti Corruption Layer),又叫防腐层,参考文献:https://blog.csdn.net/muzizongheng/article/details/108871808

建立OHS -> Local -> AppService

> 概念OHS (Open Host Service) , 又叫开放主机服务,主要是定义一种协议,让你的子系统通过该协议来访问你的服务。你需要将该协议公开,这样任何与你集成的应用都可以使用该协议

建立OHS -> PL

> 概念PL(Published Language),又叫发布语言,和开放主机服务一起,例如json,xml或者自定义文档返回格式等

建立Domain -> Models

> 概念Domain,又叫领域,领域下可以建立自己的领域模型

2.将原来Function里面的方法放入到AppService中

原方法:

 1 //注意:Name 必须在单个 Xncf 模块中唯一!
2 public override string Name => "更新文档";
3
4 public override string Description => "从 GitHub 上更新最新的官方文档。官方地址:https://gitee.com/NeuCharFramework/NcfDocs";
5 public override Type FunctionParameterType => typeof(UpdateDocs_Parameters);
6
7 /// <summary>
8 /// 运行
9 /// </summary>
10 /// <param name="param"></param>
11 /// <returns></returns>
12 public override FunctionResult Run(IFunctionParameter param)
13 {
14 /* 这里是处理文字选项(单选)的一个示例 */
15 return FunctionHelper.RunFunction<UpdateDocs_Parameters>(param, (typeParam, sb, result) =>
16 {
17 //do something
18 result.Message = "执行成功"
19 });
20 }

AppService里面的方法:

 1 /// <summary>
2 /// 运行
3 /// </summary>
4 /// <param name="param"></param>
5 /// <returns></returns>
6 [FunctionRender("更新文档", "从 GitHub 上更新最新的官方文档。官方地址:https://gitee.com/NeuCharFramework/NcfDocs", typeof(Register))]
7 public async Task<StringAppResponse> Run(Docs_RunRequest request)
8 {
9 StringBuilder sb = new StringBuilder();
10 return await this.GetResponseAsync<StringAppResponse, string>(async (response, logger) =>
11 {
12 //do something
13
14 response.Data = "执行成功"
15
16 logger.Append(response.Data);
17 return null;
18 }, saveLogAfterFinished: true);
19 }

3.建立对应的参数的内容

在PL中建立你需要的参数

 1 using Senparc.Ncf.XncfBase.FunctionRenders;
2 using System;
3 using System.Collections.Generic;
4 using System.Text;
5
6 namespace ML.Xncf.Docs.OHS.PL
7 {
8 public class Docs_RunRequest : FunctionAppRequestBase
9 {
10 }
11 }

4.将原来需要调用和触发方法的地方修改

原注册文件中卸载的方法

1 public override async Task UninstallAsync(IServiceProvider serviceProvider, Func<Task> unsinstallFunc)
2 {
3 //指定需要删除的数据实体
4 ClearDocs clearDocs = new ClearDocs(serviceProvider);
5 _ = clearDocs.Run(null);
6
7 await unsinstallFunc().ConfigureAwait(false);
8 }

现注册文件中卸载的方法

1 public override async Task UninstallAsync(IServiceProvider serviceProvider, Func<Task> unsinstallFunc)
2 {
3 //指定需要删除的数据实体
4 ClearDocsAppService clearDocsAppService = serviceProvider.GetService<ClearDocsAppService>();
5 var docsRunRequest = new Docs_RunRequest();
6 await clearDocsAppService.Run(docsRunRequest);
7
8 await unsinstallFunc().ConfigureAwait(false);
9 }

5.将入口文件Register中使用到Function的地方去掉

原内容:

1 public override IList<Type> Functions => new Type[] {
2 typeof(UpdateDocs),
3 typeof(ClearDocs),
4 };

现在:

找到以上源码,直接删除即可

6.将Function及下面对应的文件删除

7.更新Xncf Module的发布版本

8.重新发布即可

有疑问随时欢迎交流

NCF 中如何将Function升级到FunctionRender的更多相关文章

  1. 在C#中实现软件自动升级

    在C#中实现软件自动升级 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的 ...

  2. VS开发】C中调用C++文件中定义的function函数

    [VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...

  3. CVE-2020-0668-Windows服务跟踪中的普通特权升级错误

    CVE-2020-0668-Windows服务跟踪中的普通特权升级错误 在这里中,我将讨论在Windows Service跟踪中发现的任意文件移动漏洞.从我的测试来看,它影响了从Vista到10的所有 ...

  4. 如何解决Selenium中"Cannot find function addEventListener in object [object HTMLDocument]"的错误

    project: blog target: how-to-resolve-cannot-find-function-addEventListener-error-in-selenium.md stat ...

  5. Spring 5 MVC 中的 Router Function 使用

    Spring 5 发行已经好几年了,里面提出了好几个新点子.其中一个就是 RouterFunction,这是个什么东西呢? Spring框架给我们提供了两种http端点暴露方式来隐藏servlet原理 ...

  6. C++11中的std::function

    看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::fun ...

  7. JS中匿名函数$(function(){ })和(function(){})()的区别

    “$(function(){ });” Jquery语法的匿名函数,用于存放操作DOM对象的代码,执行其中代码时DOM对象已存在: (通过这样就可以在页面加载完成时通过ajax再异步加载一些数据) “ ...

  8. VB 中Sub和Function的区别

    Sub可以理解为执行一个过车,一个操作. Function在执行完过后,还要返回一个结果. Sub:过程:Function:函数,可以带返回值. 语法: Sub SubName(参数1,参数2,... ...

  9. 在html中关于如果function的函数名和input的name一样会发生怎样的现象

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="2_PageMethods. ...

随机推荐

  1. P4249-[WC2007]剪刀石头布【费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P4249 题目大意 \(n\)个点的竞赛图有的边已经确定了方向,要求给剩下的边确定一个方向使得图的三元环最多. \( ...

  2. P3244-[HNOI2015]落忆枫音【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3244 题目大意 给出一个\(\text{DAG}\),保证\(1\)可以到达所有点.然后再加入一条边(之后不一定 ...

  3. 一凡老师亲录视频,Python从零基础到高级进阶带你飞

    如需Q群交流 群:893694563 不定时更新2-3节视频 零基础学生请点击 Python基础入门视频 如果你刚初入测试行业 如果你刚转入到测试行业 如果你想学习Python,学习自动化,搭建自动化 ...

  4. IP多播与NAT地址转化

    IP多播 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用IP多播地址. 如果某台主机想要收到某个特定的多播分组,那么怎样才能是这 ...

  5. FastAPI(54)- 详解 Request 请求对象

    背景 前面讲了可以自定义 Response,那么这里就讲下请求对象 Request 可以通过 Request 来获取一些数据 获取请求基础信息 @app.get("/base") ...

  6. 洛谷 P1862 输油管道问题

    题意 题目链接:P1862 输油管道问题 不难看出每个油井的 \(x\) 坐标是没用的,所以问题转化为如下. 代数意义:给出 \(n\) 个数 \(y_1,y_2,\ldots,y_n\),找一个数 ...

  7. 双指针之滑动窗口(长度最小的子数组 和 和为s的连续正数序列)

    双指针之滑动窗口 (长度最小的子数组:和为s的连续正数序列) 1, 什么时候使用? (与子数组/字符串 有关的题目)~如果给了某个具体值的target,即用滑动窗口 不然就双指针(一般做法,左边< ...

  8. 题解 CF468C Hack it!

    题目传送门 Description 设 \(f(i)\) 表示 \(i\) 的数码只和,给出 \(a\),求出 \(l,r\) 使得 \(\sum_{i=l}^{r} f(i)\equiv 0\pmo ...

  9. Golang通脉之map

    Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map 是一种无序的键值对的集合.map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 map ...

  10. 欧姆龙plc通讯协议格式

    欧姆龙CPM1A型plc与上位计算机通信的顺序是上位机先发出命令信息给PLC,PLC返回响应信息给上位 机.每次通信发送/接受的一组数据称为一"帧".帧由少于131个字符的数据构成 ...