写点什么

NCF 如何正确创建 Xncf 并使用(二)

作者:MartyZane
  • 2021 年 12 月 12 日
  • 本文字数:4045 字

    阅读完需:约 13 分钟

概述

下面要阐述的内容主要是围绕 NCF 中的核心 Xncf 来展开说明的,他揭秘了 NCF 的神奇能力,同时它也扩展了传统的思维方式,让你又一次的近距离的了解了 NCF

模块化开发思想

NCF 采用模块化的思想构建,在系统底层的支持库基础之上,所有的功能模块都以“模块”的形式出现,“一切皆模块”。

例如,数据管理功能可以是一个模块、系统内核可以是一个模块、管理后台可以是一个模块,以及业务层面的购物车可以是一个模块、支付可以是一个模块、评价可以是一个模块,等等。甚至可视化创建模块的功能本身也是一个模块。

使用 NCF 的模块化开发有诸多的好处,比如:

  1. 小粒度功能开发,方便解耦和单元测试;

  2. 模块间可以相互调用,方便功能重用;

  3. 小粒度发布(支持 Nuget 包发布),方便共享模块功能;

  4. 方便代码和功能移植;

  5. 提供统一的模块化接口,方便系统集成(甚至是现有系统经过简单修改就可以作为一个模块集成到到 NCF);

  6. 可视化模块模板,以及多类型自由选择的接口实现,快速构建业务基础代码;

  7. 独立模块的安装、卸载可以做到完全数据库表隔离,互不影响,可靠性高;

  8. 独立模块可以小粒度单独升级,不影响其他模块;

  9. 等等。


模块代号

NCF 的模块内部代号:Xncf,其中 X 即 Extension(可扩展)、Unknown(未知)之意,ncf 即表明此模块根植于 NCF 大框架。


命名规则

每一个 Xncf 模块都需要具备一个全局唯一的模块名称,格式如:

Senparc.Xncf.DatabaseToolkit

此名称被 . 分成 3 个部分:

Senparc(组织名称,用于标记提供该模块的组织、公司或个人)

Xncf(固定字符,表明这是一个 Xncf 模块)

DatabaseToolkit(功能描述,如同一个功能下还有子模块,可以继续用 . 继续分割下一级,如:Senparc.Xncf.DatabaseToolkit.Backup)


举例:

米立科技下的一个用户的模块,就可以命名为

ML.Xncf.User


腾讯公司下的一个微信的模块,就可以命名为

Tencent.Xncf.Wechat


等等,你可以按照自己喜欢命名的方式,命名

Xncf 的构成

Xncf 模块的必要基础

首先,每个 Xncf 模块,都是一个或多个独立的项目(Project),可以使用 .csproj 文件(如果使用 C# 开发)打开并管理,并且可以被 NCF Web 项目所引用(直接或间接都可以);其次,需要一个类,实现用于让 NCF 系统识别 Xncf 模块信息、进行相关操作的接口(通常在项目根目录下创建一个名为 Register.cs 的文件,类名为 Register)。

也可以换一种说法:任何一个独立项目(Project)都可以升级成 Xncf 模块,只需要实现一些必须的接口。

IXncfRegister 接口(必须)

必须要包含的接口是:IXncfRegister(所属基础库:Senparc.Ncf.XncfBase)。

IXncfRegister 接口中包含了模块名称、全局唯一编号、版本号、菜单名称、图标等模块元数据信息,并且可以定义模块安装、卸载等过程中需要执行的代码。

关于 IXncfRegister 接口的详细介绍请见:IXncfRegister

为了方便开发者使用,NCF 默认提供了一个基于 IXncfRegister 接口的实现:XncfRegisterBase,因此,通常我们只需要在项目中,创建一个 Register.cs 类文件,然后继承 XncfRegisterBase 基类,并实现其指定的接口,即可使这个项目快速变成一个 Xncf 模块。

[XncfRegister] 特性

在每个模块项目自定义的 Register 类上,使用 [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 模块有自动和手动两种方式:

  1. 手动方式即按照 Xncf 的构成 中的要求,创建 Register 类,并实现一系列的接口。

  2. 【推荐】使用 UI 可视化配置的方式自动创建模块。值得一提的是:这个用于创建 Xncf 模块的功能,也是由一个名为 Senparc.Xncf.XncfBuilder 的 Xncf 模块提供的。

以下使用“0 代码”创建的方式,对使用可视化自动创建 Xncf 模块基础代码的方式进行介绍。

安装 Senparc.Xncf.XncfBuilder

运行 NCF 项目,进入到 【模块管理】菜单,在“新发现模块”列表中,找到 XNCF 模块生成器(Senparc.Xncf.XncfBuilder),点击【安装】按钮:


安装后:

启用 Senparc.Xncf.XncfBuilder

点击【开启】按钮,启用此模块:

设置 Xncf 模块信息

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

提示

  1. 所有参数都有说明,这里不再赘述,需要特别说明的是:

  2. 【解决方案文件(.sln)路径】参数,可以输入当前正在运行的 NCF 的项目解决方案文件路径,也可以是其他任意的 NCF 项目的解决方案文件路径(例如有时我们会同时开发多个项目,使用多个解决方案)。新的 Xncf 模块项目会自动添加到指定的解决方案中,因为如此,如果指定的解决方案正在运行 Web 站点(如 IISExpress),那么会导致站点自动重启,因为解决方案文件会被修改。

  3. 上述输入的组织名称为 MySenparc,模块名称为 MyApp,因此可以推测,最终模块的全名为:MySenparc.Xncf.MyApp

(本文以当前正在运行的 NCF.sln 为例。)

除了以上基础信息外,继续下拉,还可以看到【功能配置】选项,如需模块配置对应功能的基础代码(实现对应功能接口),即可勾选。

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


安装 Xncf Module 模板

首先检测一下 Xncf Module 模板是否有安装到本地

如果没有,就需要执行下面的命令来进行安装

dotnet new --install Senparc.Xncf.XncfBuilder.Template
复制代码

安装完成后,再次执行dotnet new显示内容如下

Nuget 地址:https://www.nuget.org/packages/Senparc.Xncf.XncfBuilder.Template


生成 Xncf

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

提示: 由于当前设置的 .sln 文件就是当前正在运行的站点解决方案,因此,成功提示中的【下载日志】按钮将无效。


载入 Xncf 模块

回到 Visual Studio,当新的 Xncf 模块代码自动创建之后,会自动加入到 NCF.sln 解决方案中,因此可以看到这样的提示:

点击【重载】按钮,重新加载解决方案。

可以在【解决方案资源管理器】中看到,新的项目 MySenparc.Xncf.MyApp 已经被自动创建,到目前仍然是“0 代码”:

安装并启用 MySenparc.Xncf.MyApp 模块

将“0 代码”进行到底,直接按键盘 Ctrl + F5 运行 Senparc.Web 项目,并进入后台:

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

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

回到网页,点击MySenparc.Xncf.MyApp 右侧的【安装】按钮,完成模块的安装,并点击【启用】按钮激活模块。

在“启用”之前,已经可以看到数据库表的变化:

安装过程自动为数据库添加了 2 张表

__MySenparc_MyApp__EFMigrationsHistory(EFCore 进行数据库迁移、升级的历史版本记录,由 EFCore 在进行迁移操作(Migration)时自动修改)

MySenparc_MyApp_Color(由于勾选了【安装 Sample】的选项,此数据库是用于演示 Sample 中数据库操作的示例)

提示: 在自动生成的表名中,都可以看到 MySenparc_MyApp 这个前缀,这么做的好处是,即使不同的组织发布了名称相同的模块(如 MySenparc.Xncf.MyApp 和 YourSenparc.Xncf.MyApp),也可以很好兼容,不会发生冲突。

回到网页,可以看到已经启用状态的模块信息:

提示

①:可以看到支持网页的模块菜单,和之前未包含网页的菜单(如数据库工具包)多了一层目录,除了大家都有的 设置/执行 页面以外,还多了自定义的网页。

②:在“特性”栏里面可以看到当前模块所支持的特性:网页、数据库、执行方法(Function)。

③:拥有网页功能的 Xncf 模块没会被要求定义一个“首页”,可以在此页面上快速进入。


功能演示

在了解内部文件和原理之前,我们先来看一下这个 Sample 完成哪些功能的演示。

函数(Function)

函数功能用于完成一个简单的小粒度的操作,支持在 NCF 后台被可视化地操作,并可以使用代码调用执行。

打开模块设置的默认页面(即【设置/执行】菜单),即可看到右侧有【执行】按钮,每一个【执行】按钮都代表着一个函数(Function):

提示:这个函数的功能将通过用户输入的参数进行自动的加减乘除及平方的计算。

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

填写信息并设置选项,以下配置将执行 (2 × 3)² 的计算

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

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


发布于: 3 小时前阅读数: 9
用户头像

MartyZane

关注

坚持不懈,直到成功 2021.03.15 加入

技术痴一枚,资深开发,喜欢交流,热爱开源,希望能与更多优秀的开发者一共为社会的进步贡献一份自己的力量

评论

发布
暂无评论
NCF 如何正确创建Xncf并使用