NCF 如何正确创建Xncf并使用(二)
概述
下面要阐述的内容主要是围绕NCF中的核心Xncf来展开说明的,他揭秘了NCF的神奇能力,同时它也扩展了传统的思维方式,让你又一次的近距离的了解了NCF
模块化开发思想
NCF 采用模块化的思想构建,在系统底层的支持库基础之上,所有的功能模块都以“模块”的形式出现,“一切皆模块”。
例如,数据管理功能可以是一个模块、系统内核可以是一个模块、管理后台可以是一个模块,以及业务层面的购物车可以是一个模块、支付可以是一个模块、评价可以是一个模块,等等。甚至可视化创建模块的功能本身也是一个模块。
使用 NCF 的模块化开发有诸多的好处,比如:
模块代号
NCF 的模块内部代号:,其中 即 Extension(可扩展)、Unknown(未知)之意, 即表明此模块根植于 NCF 大框架。
命名规则
每一个 Xncf 模块都需要具备一个全局唯一的模块名称,格式如:
Senparc.Xncf.DatabaseToolkit
此名称被 . 分成 3 个部分:
Senparc(组织名称,用于标记提供该模块的组织、公司或个人)
Xncf(固定字符,表明这是一个 Xncf 模块)
DatabaseToolkit(功能描述,如同一个功能下还有子模块,可以继续用 . 继续分割下一级,如:)
举例:
米立科技下的一个用户的模块,就可以命名为
ML.Xncf.User
腾讯公司下的一个微信的模块,就可以命名为
Tencent.Xncf.Wechat
等等,你可以按照自己喜欢命名的方式,命名
Xncf的构成
Xncf模块的必要基础
首先,每个 Xncf 模块,都是一个或多个独立的项目(Project),可以使用 .csproj 文件(如果使用 C# 开发)打开并管理,并且可以被 NCF Web 项目所引用(直接或间接都可以);其次,需要一个类,实现用于让 NCF 系统识别 Xncf 模块信息、进行相关操作的接口(通常在项目根目录下创建一个名为 的文件,类名为 )。
也可以换一种说法:任何一个独立项目(Project)都可以升级成 Xncf 模块,只需要实现一些必须的接口。
IXncfRegister 接口(必须)
接口中包含了模块名称、全局唯一编号、版本号、菜单名称、图标等模块元数据信息,并且可以定义模块安装、卸载等过程中需要执行的代码。
为了方便开发者使用,NCF 默认提供了一个基于 接口的实现:,因此,通常我们只需要在项目中,创建一个 类文件,然后继承 基类,并实现其指定的接口,即可使这个项目快速变成一个 Xncf 模块。
[XncfRegister] 特性
在每个模块项目自定义的 类上,使用 [XncfRegister] 特性,使系统可以快速识别当前类为 Xncf 注册类(预留功能,建议都加上)。
根据上述的要求,一个最小化的 Xncf 模块注册类,可能如下所示:
using Senparc.Ncf.XncfBase;
using System;
using System.Collections.Generic;
namespace Senparc.Xncf.XncfBuilder
{
[XncfRegister]
public partial class Register : XncfRegisterBase, IXncfRegister
{
#region IRegister 接口
public override string Name => "Senparc.Xncf.XncfBuilder";
public override string Uid => "C2E1F87F-2DCE-4921-87CE-36923ED0D6EA";
public override string Version => "0.2.6";
public override string MenuName => "XNCF 模块生成器";
public override string Icon => "fa fa-plus";
public override string Description => "快速生成 XNCF 模块基础程序代码,或 Sample 演示,可基于基础代码扩展自己的应用";
#endregion
}
}
创建Xncf模块
创建方式
创建 Xncf 模块有自动和手动两种方式:
以下使用“0 代码”创建的方式,对使用可视化自动创建 Xncf 模块基础代码的方式进行介绍。
安装 Senparc.Xncf.XncfBuilder
运行 NCF 项目,进入到 【模块管理】菜单,在“新发现模块”列表中,找到 (Senparc.Xncf.XncfBuilder),点击【安装】按钮:

安装后:

启用 Senparc.Xncf.XncfBuilder
点击【开启】按钮,启用此模块:

设置 Xncf 模块信息
点击【生成 XNCF】右侧的【执行】按钮,对将要生成的 Xncf 信息进行设置:

提示
(本文以当前正在运行的 NCF.sln 为例。)
除了以上基础信息外,继续下拉,还可以看到【功能配置】选项,如需模块配置对应功能的基础代码(实现对应功能接口),即可勾选。

最下方是【安装Sample】的选项,如果您是第一次接触 NCF,强烈建议您勾选此选项,安装的 Sample 将会向您展示一个包含数据库、函数(Function)、网页的多功能的 Xncf 模块,便于您更加生动和具体地了解 Xncf 的构成和对应功能的实现。当然,除此之外,Sample 中的代码也可以为您创建自己的业务代码提供参考。
安装Xncf Module模板
首先检测一下Xncf Module模板是否有安装到本地

如果没有,就需要执行下面的命令来进行安装
dotnet new --install Senparc.Xncf.XncfBuilder.Template
安装完成后,再次执行显示内容如下

生成 Xncf
检查信息,确认无误后,点击【执行】按钮,0.5 秒左右,即可完成定制化 Xncf 项目的创建:

提示: 由于当前设置的 .sln 文件就是当前正在运行的站点解决方案,因此,成功提示中的【下载日志】按钮将无效。
载入 Xncf 模块
回到 Visual Studio,当新的 Xncf 模块代码自动创建之后,会自动加入到 NCF.sln 解决方案中,因此可以看到这样的提示:

点击【重载】按钮,重新加载解决方案。
可以在【解决方案资源管理器】中看到,新的项目 已经被自动创建,到目前仍然是“0代码”:

安装并启用 MySenparc.Xncf.MyApp 模块
将“0代码”进行到底,直接按键盘 Ctrl + F5 运行 Senparc.Web 项目,并进入后台:

此时可以看到“发现新模块”统计数字由 3 变成了 4,点击这个标签,进入到【模块管理】页面,即可看到“发现新模块”列表中,出现了上述操作自动生成的 模块,菜单显示名称为 ,和设置的一致:

当我们点击右侧对应的【安装】按钮后,即可完成这个自定义模块的安装,不过在此之前,为了了解数据库的变化,我们先来看一下当前数据库的表(以 SQL Server 为例):

回到网页,点击 右侧的【安装】按钮,完成模块的安装,并点击【启用】按钮激活模块。
在“启用”之前,已经可以看到数据库表的变化:

安装过程自动为数据库添加了 2 张表
__MySenparc_MyApp__EFMigrationsHistory(EFCore 进行数据库迁移、升级的历史版本记录,由 EFCore 在进行迁移操作(Migration)时自动修改)
MySenparc_MyApp_Color(由于勾选了【安装Sample】的选项,此数据库是用于演示 Sample 中数据库操作的示例)
提示: 在自动生成的表名中,都可以看到 这个前缀,这么做的好处是,即使不同的组织发布了名称相同的模块(如 和 ),也可以很好兼容,不会发生冲突。
回到网页,可以看到已经启用状态的模块信息:

提示
①:可以看到支持网页的模块菜单,和之前未包含网页的菜单(如)多了一层目录,除了大家都有的 页面以外,还多了自定义的网页。
②:在“特性”栏里面可以看到当前模块所支持的特性:网页、数据库、执行方法(Function)。
③:拥有网页功能的 Xncf 模块没会被要求定义一个“首页”,可以在此页面上快速进入。
功能演示
在了解内部文件和原理之前,我们先来看一下这个 Sample 完成哪些功能的演示。
函数(Function)
函数功能用于完成一个简单的小粒度的操作,支持在 NCF 后台被可视化地操作,并可以使用代码调用执行。
打开模块设置的默认页面(即【设置/执行】菜单),即可看到右侧有【执行】按钮,每一个【执行】按钮都代表着一个函数(Function):

提示:这个函数的功能将通过用户输入的参数进行自动的加减乘除及平方的计算。
点击“我的函数”右侧的【执行】按钮,即可弹出“我的函数”这个函数的可视化操作界面,其中定义了这个函数要求输入的所有变量,这些变量是可以通过代码自由设置的,实例中包括了名称、数字1、数字2、运算符,以及计算平方的选项。

填写信息并设置选项,以下配置将执行 的计算

点击【执行】后,输出计算结果:

在结果页面上,我们还能看到有一个“下载日志”的链接,此日志只会在服务器缓存中暂存 5 分钟。下载并打开,可以看到日志中记录了完整的计算过程:
