Разрешение двум проектам наследовать от одной и той же связи

Использование Microsoft Bond в проекте C#.

Предположим, у меня был файл Bond A, используемый в одном проекте A', и я хотел, чтобы у двух проектов B' и C'были файлы Bond C и C, оба из которых имеют структуры, которые наследуются от структуры в файле A. Как бы я это сделал??

Я думал о создании ProjectReference, но, похоже, он предоставляет только классы C#, сгенерированные из этих файлов Bond, и не позволяет мне наследовать Bond из исходных файлов Bond, поэтому вместо этого я сделал ссылку между одним проектом на другой. К сожалению, мое текущее решение очень подвержено ошибкам, и изменение этого местоположения файла в одном проекте также может сломать другой.

Каков будет предложенный способ сделать это?

1 ответ

Решение

Для того чтобы файлы Bond B и C наследовали или содержали типы из файла A Bond (в проекте A'), вам необходимо импортировать файл B связывания A вверху B и C. Это делает типы в A известными в B и C,

связь

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. Используйте относительный путь как import "../../projectAPrime/schemas/a.bond"
  3. Используйте относительный путь как import "a.bond", import "schemas/a.bond" and add to the Bond import paths: elsewhere in the consuming project, you'd make sure that theЭлемент 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 нет способа для проекта "экспортировать" значения, которые автоматически получает ссылка на проект (что я в курсе).

Обратите внимание, что вам все еще понадобится ProjectReference для проекта A', поскольку код, сгенерированный в проектах B' и C', будет зависеть от кода, сгенерированного и скомпилированного в сборку, создаваемую проектом A'.

Для рабочего примера импорта, используя BondImportDirectory см. пример импорта C# в хранилище Bond. Однако это не относится к межпроектному импорту, поэтому вам необходимо адаптироваться к вашей ситуации.

Если вы разработчик на C++, это должно быть похоже на #include пути.

Другие вопросы по тегам