细分 AL 代码并减少与命名空间的命名冲突
命名空间用于将代码组织到逻辑组和层次结构中,这可以防止组合库时可能发生的命名冲突。 命名空间确保代码名称的唯一性,并允许在不同的上下文中重用名称。 命名空间为代码库提供结构,使其更易于导航和理解。 命名空间用于许多编程语言,并且在 Business Central 中,它们可以通过 AL 来使用。
AL 文件在文件开头声明一个命名空间,代码文件中的所有对象都属于该命名空间。 一个给定对象只能属于一个命名空间,但同一个命名空间可以用于多个 AL 文件,这意味着用于多个对象和多个模块。 有两个编译器规则专门适用于命名空间和对象命名:
模块中只能有一个同名的对象
命名空间中只能有一个同名的对象
重命名现有对象或成员名称是一项中断性变更,因此命名空间仅对现有对象的逻辑结构有帮助。
如果您重命名命名空间,依赖于您的应用的任何应用都会中断,同样,如果您的任何依赖项重命名其命名空间,您的应用也会中断。
若要在 AL 中声明命名空间,您必须使用命名空间关键字,后跟命名空间的名称。 命名空间关键字的一些最佳做法是:
命名空间应该是全局唯一的。
命名空间的第一部分与开发组织或个人相关,后跟产品名称和产品内的逻辑分组,例如,
namespace BigCompany.SmartProduct.SomeProductArea
。 这支持命名空间的两个目的 - 对象名称唯一和相关功能的逻辑分组。为命名空间使用稳定且非版本特定的名称。 更改命名空间的名称是一项中断性变更。
命名空间名称可以是任何有效的 AL 标识符,并且可以包含点来指示命名空间的层次结构。
以下示例显示命名空间声明的语法。 代码文件中声明的所有对象都属于命名空间 MyNamespace。 此处显示的语法仅用于举例说明,因为将对象分成不同的文件并使用与对象相同的文件名仍然是最佳做法。 有关详细信息,请参阅 AL 代码的最佳做法。
namespace MyNamespace;
// codeunits, tables, pages....
现在,若要引用 MyNamespace 中的对象,您必须使用完全限定的名称或 using 指令。 有关详细信息,请参阅 Using 指令。
若要在同一命名空间中声明多个对象,您可以在其他 .al 文件中使用相同的命名空间声明。 使用相同命名空间声明的所有代码文件都属于同一命名空间。
using 指令
若要引用其他命名空间中的对象,您可以使用完全限定的名称或 using 指令。 using 指令用于引用其他命名空间中的对象,无需使用完全限定的名称。 using 指令位于 .al 文件顶部、命名空间声明之后和任何对象声明之前。 以下示例显示命名空间声明和 using 指令的顺序。 using 指令的顺序并不重要。
namespace MyNamespace;
using SomeOtherNamespace;
codeunit 10 MyCode
{
...
}
当解析对象时,首先使用最接近的范围解析它们。 因此,若要解析为依赖项扩展中的类似命名对象,引用必须使用完全限定的名称。 或者,可以定义 using 指令来引用外部命名空间,并避免使用完全限定的名称来引用其中的对象。
嵌套命名空间是在另一个命名空间内声明的命名空间。 与必须在 30 个字符的对象名称中表达完整结构相比,嵌套命名空间能够更好、更结构化地命名对象。 以下语法显示 MyNamespace 命名空间内 MyNestedNamespace 的嵌套命名空间声明(用点分隔)。
namespace MyNamespace.MyNestedNamespace;
在本示例中,命名空间的完全限定的名称是 MyNamespace.MyNestedNamespace。 若要引用 MyNestedNamespace 命名空间中的对象,您必须使用完全限定的名称或 using 指令。 因此,为了能够访问在 MyNestedNamespace 中声明的对象,请在代码中包含以下语句:
using MyNamespace.MyNestedNamespace
使用代码操作帮助将命名空间添加到现有源。 有关详细信息,请参阅代码操作。
总结
AL 文件可以在顶部定义一个命名空间,该命名空间适用于代码文件中的所有对象。 一个给定对象只能属于一个命名空间,但同一个命名空间可以用于多个 AL 文件和对象。
当解析对象时,首先使用最接近的范围。 因此,若要解析为依赖项扩展中的类似命名对象,引用必须使用完全限定的名称。 或者,您可以为它定义 using 指令以包含外部命名空间并忽略完全限定的名称。
由于命名空间对于扩展的逻辑细分非常有用,因此 AL Explorer 还显示对象的命名空间并允许按命名空间分组对象。 这将更轻松地发现相关对象、关注应用子区域以及在添加新对象时识别不一致问题。
与在 30 个字符的对象名称中表达完整结构相比,嵌套命名空间能够更好地命名对象。 但是,重命名现有对象是一项中断性变更,所以此功能主要对现有对象的逻辑结构和以后的新名称有帮助。
下面是按命名空间分组的基础应用对象的示例,其中 Customer 表位于 Microsoft.Sales.Customer 命名空间中。 通过按命名空间分组对象,可以更轻松地关注和查找相关对象。