允许两个项目继承同一个债券

Allowing two projects to inherit from the same bond

在 C# 项目中使用 Microsoft Bond

假设我在一个项目 A' 中使用了一个 Bond 文件 A,并希望两个项目 B' 和 C' 具有 Bond 文件 B 和 C,这两个项目都具有从文件 A 中的结构继承的结构。我该怎么做?

我考虑制作一个 ProjectReference,但它似乎只提供从这些 Bond 文件生成的 C# 类,并且不允许我从原始 Bond 文件继承 Bond,所以我改为制作了一个link 从一个项目到另一个项目。不幸的是,我当前的解决方案非常容易出错,更改一个项目中的文件位置也会破坏另一个项目。

建议的方法是什么?

要让债券文件 B 和 C 继承或包含债券文件 A 的类型(在项目 A' 中),您需要在 B 和 C 的顶部导入债券文件 A。这使得 A 中的类型在 B 和 C 中已知。

a.bond

namespace A;

struct Base { }

b.bond

import "a.bond"

namespace B;

struct Derived : A.Base { } 

struct Composition {
    // notice fully qualified name is used for Base
    0: A.Base has_a_base;
}

对于导入路径,您有以下三种选择:

  1. 使用像 import "C:/src/projectAPrime/schemas/a.bond"
  2. 这样的完全限定路径
  3. 使用相对路径,如 import "../../projectAPrime/schemas/a.bond"
  4. 使用 import "a.bond"import "schemas/a.bond" 之类的相对路径并添加到 Bond 导入路径:在消费项目的其他地方,您要确保 BondImportDirectory 项已增加带有项目 A 的搜索目录。

我不推荐第一个选项,因为它将路径与特定机器的布局联系在一起。选项 2 或 3 的混合在实践中使用。

对于方法三,使用项目通常直接包含这样的内容,或者通过它导入的其他一些 MSBuild 文件。

<ItemGroup>
  <BondImportDirectory Include="$(ProjectAPrimeRoot)" />
  <!-- or some other reference to project A, depending
       on how your projects are structured (perhaps you
       have a all_projects.props file for these sort of
       variables or item modifications -->
</ItemGroup>

我不能给你比这更具体的指导,因为我不知道你的具体项目结构,而且 MSBuild 没有办法让项目“导出”引用项目自动获取的值(我知道)。

请注意,您仍然需要对项目 A' 的 ProjectReference,因为在项目 B' 和 C' 中生成的代码将依赖于生成并编译到项目 A' 生成的程序集中的代码。

有关使用 BondImportDirectory 导入的工作示例,请参阅 Bond 存储库中的 C# import example。但是,这不会解决跨项目导入问题,因此您需要根据自己的情况进行调整。

如果您是 C++ 开发人员,这应该类似于 #include 路径。