Genexus Extensions SDK - 是否有一个内置的帮助程序来本地保存数据?
Genexus Extensions SDK - Is there a built in helper to save data locally?
我想知道 Genexus Extension SDK 是否已经实现了一些东西来在本地存储持久数据(KB 独立和每 KB),比如来自 ManagedEsent
的 PersistentDictionary
- 我知道genexus使用SQL服务器来存储KB相关信息,有接口可以让我扩展吗?
- 我想为每个 genexus 实例(本地)保存数据,并在用户每次执行 Genexus 时使用该数据加载我的扩展配置。
我们不使用 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
, int
和 bool
.
设置的操作
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 的属性 Location
和 UserDirectory
来访问 KB 位置或 KB 位置下当前用户的目录,但这取决于您文件的处理。您必须决定文件格式(二进制或文本)、文本文件的文件编码,并处理对该文件的所有读写操作。
我们使用 kb.UserDirectory
路径来存储非关键内容,例如上次关闭 KB 时打开的对象集,或不同对话框的过滤器值。
如果您想将设置存储在知识库中,有很多选择。
- 您可以向现有对象、知识库版本或环境添加属性。将其设置为 属性 并不意味着您必须编辑 属性 网格中的值,尽管这通常是可行的方法。
- 您可以定义一种新的实体。实体是可以存储在 KB 中的基本元素。实体可以根据 KB 的活动版本进行存储,也可以独立于当前版本。实体可以具有属性,其序列化由 属性 引擎处理,也可以读取和存储字节数组,其格式和内容将由您处理。
- 您可以向现有对象添加一部分。例如,您可能想向 Procedure 对象添加一个部分。为此,您必须扩展
KBObjectPart
,在 BL 包中定义您的部分,声明该部分由特定类型的对象组成,并在 UI 中为您的新部分提供一个编辑器包裹。 KBObjectPart
extends Entity
因此该部分的序列化与之前的情况类似。此选项的一个警告是您还必须处理部件内容的导入、导出和比较方式。
- 您可以添加一种新的对象。对象扩展
KBObject
class,后者扩展 Entity
。对象没有义务具有部分(例如 Folder 对象没有任何部分)。在选择提供一种新的对象时,您必须考虑几件事,例如:
- 您希望能够从新对象对话框创建新实例吗?
- 会在文件夹视图中显示吗?
- 可以添加到模块中吗?
- 是否可以与其他不同类型的对象同名?
作为一般准则,如果您选择添加新的 属性,请将其添加到对象、版本或环境,而不是部件。向部件添加属性对于可发现性来说不是很好。此外,如果您选择添加一种新的对象,即使它继承自 Entity
,如前所述,它可以读取和存储字节数组,但最好不要使用 KBObject
中的字节数组并向其添加 KBObjectPart
。这样 KBObject
尽可能保持轻量级,并且从数据库加载对象定义仍然很快,并且只有在真正需要时才加载 blob 内容。
没有经验法则。根据场景的具体情况,一个选项可能比其他选项更适合。
我想知道 Genexus Extension SDK 是否已经实现了一些东西来在本地存储持久数据(KB 独立和每 KB),比如来自 ManagedEsent
的PersistentDictionary
- 我知道genexus使用SQL服务器来存储KB相关信息,有接口可以让我扩展吗?
- 我想为每个 genexus 实例(本地)保存数据,并在用户每次执行 Genexus 时使用该数据加载我的扩展配置。
我们不使用 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
, int
和 bool
.
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 的属性 Location
和 UserDirectory
来访问 KB 位置或 KB 位置下当前用户的目录,但这取决于您文件的处理。您必须决定文件格式(二进制或文本)、文本文件的文件编码,并处理对该文件的所有读写操作。
我们使用 kb.UserDirectory
路径来存储非关键内容,例如上次关闭 KB 时打开的对象集,或不同对话框的过滤器值。
如果您想将设置存储在知识库中,有很多选择。
- 您可以向现有对象、知识库版本或环境添加属性。将其设置为 属性 并不意味着您必须编辑 属性 网格中的值,尽管这通常是可行的方法。
- 您可以定义一种新的实体。实体是可以存储在 KB 中的基本元素。实体可以根据 KB 的活动版本进行存储,也可以独立于当前版本。实体可以具有属性,其序列化由 属性 引擎处理,也可以读取和存储字节数组,其格式和内容将由您处理。
- 您可以向现有对象添加一部分。例如,您可能想向 Procedure 对象添加一个部分。为此,您必须扩展
KBObjectPart
,在 BL 包中定义您的部分,声明该部分由特定类型的对象组成,并在 UI 中为您的新部分提供一个编辑器包裹。KBObjectPart
extendsEntity
因此该部分的序列化与之前的情况类似。此选项的一个警告是您还必须处理部件内容的导入、导出和比较方式。 - 您可以添加一种新的对象。对象扩展
KBObject
class,后者扩展Entity
。对象没有义务具有部分(例如 Folder 对象没有任何部分)。在选择提供一种新的对象时,您必须考虑几件事,例如:- 您希望能够从新对象对话框创建新实例吗?
- 会在文件夹视图中显示吗?
- 可以添加到模块中吗?
- 是否可以与其他不同类型的对象同名?
作为一般准则,如果您选择添加新的 属性,请将其添加到对象、版本或环境,而不是部件。向部件添加属性对于可发现性来说不是很好。此外,如果您选择添加一种新的对象,即使它继承自 Entity
,如前所述,它可以读取和存储字节数组,但最好不要使用 KBObject
中的字节数组并向其添加 KBObjectPart
。这样 KBObject
尽可能保持轻量级,并且从数据库加载对象定义仍然很快,并且只有在真正需要时才加载 blob 内容。
没有经验法则。根据场景的具体情况,一个选项可能比其他选项更适合。