Genexus Extensions SDK - 是否有一个内置的帮助程序来本地保存数据?

Genexus Extensions SDK - Is there a built in helper to save data locally?

我想知道 Genexus Extension SDK 是否已经实现了一些东西来在本地存储持久数据(KB 独立和每 KB),比如来自 ManagedEsent

PersistentDictionary

我们不使用 PersistentDictionary。我建议不要使用它,因为它是 Windows 特定的 API,我们正在尝试使所有新的跨平台,作为我们在其他 运行 上制作 GeneXus BL 运行 的旅程的一部分=77=].

有不同的持久化选项,具体取决于您的场景的具体细节。

如果您想为您的扩展程序存储配置设置等内容,您可以使用位于 Artech.Common.Helpers 中的 ConfigurationHelper class。此 class 提供对 GeneXus 安装文件夹中 GeneXus.exe.config 文件中定义的配置的读取访问权限,以及对位于 [=16= 中的 Environment.config 文件的 read/write 访问权限].请注意,此文件取决于当前用户,并在同一主版本的不同 GeneXus 实例之间共享。 ConfigurationHelper class 提供读取和保存基本类型 string, intbool.

设置的操作
const string MY_EXTENSION = "MyExtensionSettings";

const string SETTING1 = "Setting1";
const string SETTING1_DEFAULT_VALUE = "This is the default value";

const string SETTING2 = "Setting2";
const int SETTING2_DEFAULT_VALUE = 20;
    
string setting1Value = ConfigurationHelper.GetUserSetting(MY_EXTENSION, SETTING1, SETTING1_DEFAULT_VALUE);
int setting2Value = ConfigurationHelper.GetUserSetting(MY_EXTENSION, SETTING2, SETTING2_DEFAULT_VALUE);

// Do something and maybe change the setting values
ConfigurationHelper.SetUserSetting(MY_EXTENSION, SETTING1, setting1Value);
ConfigurationHelper.SetUserSetting(MY_EXTENSION, SETTING2, setting2Value);

如果您想根据当前打开的 KB 将某些内容存储在文件中,则没有特定的 API 可以帮助您处理持久性。您可以使用 KnowledgeBase class 的属性 LocationUserDirectory 来访问 KB 位置或 KB 位置下当前用户的目录,但这取决于您文件的处理。您必须决定文件格式(二进制或文本)、文本文件的文件编码,并处理对该文件的所有读写操作。 我们使用 kb.UserDirectory 路径来存储非关键内容,例如上次关闭 KB 时打开的对象集,或不同对话框的过滤器值。

如果您想将设置存储在知识库中,有很多选择。

  • 您可以向现有对象、知识库版本或环境添加属性。将其设置为 属性 并不意味着您必须编辑 属性 网格中的值,尽管这通常是可行的方法。
  • 您可以定义一种新的实体。实体是可以存储在 KB 中的基本元素。实体可以根据 KB 的活动版本进行存储,也可以独立于当前版本。实体可以具有属性,其序列化由 属性 引擎处理,也可以读取和存储字节数组,其格式和内容将由您处理。
  • 您可以向现有对象添加一部分。例如,您可能想向 Procedure 对象添加一个部分。为此,您必须扩展 KBObjectPart,在 BL 包中定义您的部分,声明该部分由特定类型的对象组成,并在 UI 中为您的新部分提供一个编辑器包裹。 KBObjectPart extends Entity 因此该部分的序列化与之前的情况类似。此选项的一个警告是您还必须处理部件内容的导入、导出和比较方式。
  • 您可以添加一种新的对象。对象扩展 KBObject class,后者扩展 Entity。对象没有义务具有部分(例如 Folder 对象没有任何部分)。在选择提供一种新的对象时,您必须考虑几件事,例如:
    • 您希望能够从新对象对话框创建新实例吗?
    • 会在文件夹视图中显示吗?
    • 可以添加到模块中吗?
    • 是否可以与其他不同类型的对象同名?

作为一般准则,如果您选择添加新的 属性,请将其添加到对象、版本或环境,而不是部件。向部件添加属性对于可发现性来说不是很好。此外,如果您选择添加一种新的对象,即使它继承自 Entity ,如前所述,它可以读取和存储字节数组,但最好不要使用 KBObject 中的字节数组并向其添加 KBObjectPart 。这样 KBObject 尽可能保持轻量级,并且从数据库加载对象定义仍然很快,并且只有在真正需要时才加载 blob 内容。

没有经验法则。根据场景的具体情况,一个选项可能比其他选项更适合。