默认属性源构造
properties-default-sources 构造类似于 parameters-default-sources 构造。parameters-default-sources 构造允许在 StyleBook 中重用现有参数(来自其他 StyleBook),而 properties-default-sources 构造允许用户根据现有源指定组件的属性。
组件的属性可能分布在 StyleBook 的各个部分。例如,这些属性可能来自对象参数、返回对象的替换、其他组件的属性或来自其他组件的输出。在这种情况下,您需要在组件定义中重新定义 StyleBook 其他部分中出现的属性。显然,这是冗余的,并且可能导致错误。为了解决这个问题,可以使用 properties-default-sources 构造。properties-default-sources 构造是一个列表,其中每个项都标识了组件某些属性的来源。
例如,考虑一个创建 lbvserver 配置的组件。此组件应按如下方式定义 lbvserver 的属性。
parameters:
-
name: lb
type: ns::lbvserver
components:
-
name: lb-comp
type: ns::lbvserver
properties:
name: $parameters.lb.name
ipv46: $parameters.lb.ipv46
port: $parameters.lb.port
servicetype: $parameters.lb.servicetype
lbmethod: $parameters.lb.lbmethod
在上面的示例中,请注意组件部分中定义的所有属性的值都取自 $parameters.lb 对象。尽管它们来自单个源,但这些属性在 StyleBook 中再次定义。此外,如果向与 lbvserver 配置相关的 $parameters.lb 对象添加新的子参数,则需要更新 lb-comp 组件以添加与新子参数对应的新属性。
为了避免重新定义属性并在不显式列出属性部分的情况下获取组件的所有相关属性,可以使用 properties-default-sources 构造。上面的示例可以按如下方式编写。
parameters:
-
name: lb
type: ns::lbvserver
components:
-
name: lb-comp
type: ns::lbvserver
properties-default-sources:
- $parameters.lb
在上面的示例中,使用 properties-default-sources 构造可以减小组件定义的大小,从而允许您简洁地定义组件。此外,每次组件属性的来源发生变化时,这些变化都会自动反映出来。例如,当 $parameters.lb 对象中添加一个新属性(例如“persistencetype”)时,此属性会默认添加到 lb-comp 的配置中,因为 persistencetype 是 lbvserver 的一个属性。因此,properties-default-sources 构造提供了一个动态接口来定义组件,而无需担心组件属性来源发生的变化。
组件属性的计算
本节讨论如果在组件中使用 properties-default-sources 构造,如何获取属性。首先,StyleBooks 编译器根据组件的类型(在上面的示例中为 lbvserver)识别组件的属性列表。接下来,编译器按照它们定义的顺序(在组件的 properties-default-sources 部分中)从多个源获取这些属性。如果一个属性存在于多个源中,则最后一个源中出现的属性优先于其他源。最后,通过使用 properties-default-sources 构造获取的属性可以在组件的 properties 部分中被覆盖。需要注意的是,组件部分的定义应至少包含 properties-default-sources 部分或 properties 部分。它可能同时包含两者。