Orleans создание кода

До Orleans версии 7.0 создание источника было гораздо более ручным и требует явного вмешательства разработчика. Начиная с Orleans версии 7.0 создание кода является автоматическим и не требует вмешательства разработчика. Однако в некоторых случаях разработчики могут повлиять на создание кода, например для создания кода для типов, которые не создаются автоматически или создают код для типов в другой сборке.

Включение создания кода

Orleans создает исходный код C# для приложения во время сборки. Все проекты, включая узел, должны иметь соответствующие пакеты NuGet, чтобы включить создание кода. Доступны перечисленные далее пакеты:

Используйте этот GenerateSerializerAttribute параметр, чтобы указать, что тип предназначен для сериализации, и код сериализации должен быть создан для типа. Дополнительные сведения см. в разделе "Использование Orleans сериализации".

Среда Orleans выполнения использует созданный код, чтобы обеспечить правильную сериализацию типов, используемых в кластере, а также для создания шаблонов, которые абстрагируют сведения о реализации доставки методов, распространения исключений и других внутренних концепций среды выполнения. Создание кода можно выполнять либо при создании проектов, либо при инициализации приложения.

Что происходит во время сборки?

Во время Orleans сборки создает код для всех типов, помеченных как GenerateSerializerAttribute. Если тип не помечается, GenerateSerializerон не сериализуется с помощью Orleans.

При разработке с помощью F# или Visual Basic можно также использовать создание кода. Дополнительные сведения см. в следующих примерах:

В этих примерах показано, как использовать Orleans.GenerateCodeForDeclaringAssemblyAttributeтипы в сборке, для которой генератор источника должен проверять и генерировать источник.

Предпочтительный метод для выполнения создания кода выполняется во время сборки. Создание кода времени сборки можно включить с помощью одного из следующих пакетов:

  • Microsoft.Orleans.OrleansCodeGenerator.Build. Пакет, использующий Roslyn для создания кода и использующий Рефлексия .NET для анализа.
  • Microsoft.Orleans. CodeGenerator.MSBuild. Новый пакет создания кода, который использует Roslyn как для создания кода, так и для анализа кода. Он не загружает двоичные файлы приложений, и в результате избегает проблем, вызванных столкновением версий зависимостей и разными целевыми платформами. Новый генератор кода также улучшает поддержку добавочных сборок, что приведет к более короткому времени сборки.

Один из этих пакетов должен быть установлен во все проекты, содержащие зерна, интерфейсы зерна, пользовательские сериализаторы или типы, отправляемые между зернами. Установка пакета внедряет целевой объект в проект, который создаст код во время сборки.

Оба пакета (Microsoft.Orleans.CodeGenerator.MSBuild и Microsoft.Orleans.OrleansCodeGenerator.Build) поддерживают только проекты C#. Другие языки поддерживаются либо с помощью пакета, описанного Microsoft.Orleans.OrleansCodeGenerator ниже, либо путем создания проекта C#, который может выступать в качестве целевого объекта для кода, созданного из сборок, написанных на других языках.

Дополнительные диагностика можно создать во время сборки, указав значение в OrleansCodeGenLogLevel CSPROJ-файле целевого проекта. Например, <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Что происходит во время инициализации?

В Orleans 7+, во время инициализации ничего не происходит. Создание кода выполняется во время сборки.

Создание кода можно выполнить во время инициализации клиента и silo, установив Microsoft.Orleans.OrleansCodeGenerator пакет и используя ApplicationPartManagerCodeGenExtensions.WithCodeGeneration метод расширения:

builder.ConfigureApplicationParts(
    parts => parts
        .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
        .WithCodeGeneration());

В приведенном выше примере builder может быть экземпляр любого ISiloHostBuilder или IClientBuilder. Необязательный ILoggerFactory экземпляр можно передать для WithCodeGeneration включения ведения журнала во время создания кода, например:

ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
    builder.ConfigureApplicationParts(
        parts => parts
            .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
            .WithCodeGeneration(codeGenLoggerFactory));

Влияние создания кода

При применении GenerateSerializerAttribute к типу можно также применить IdAttribute уникальное определение элемента. Аналогичным образом можно также применить псевдоним с помощью .AliasAttribute Дополнительные сведения о влиянии на создание кода см. в разделе "Использование Orleans сериализации".

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

Добавление SerializableAttribute к типу указывает генератору кода создать сериализатор для этого типа.

Добавление [assembly: GenerateSerializer(Type)] в проект указывает генератору кода рассматривать этот тип как сериализуемый и приведет к ошибке, если сериализатор не удалось создать для этого типа, например, поскольку тип недоступен. Эта ошибка остановит сборку, если включено создание кода. Этот атрибут также позволяет создавать код для определенных типов из другой сборки.

[assembly: KnownType(Type)] также указывает генератору кода включить определенный тип (который может быть из указанной сборки), но не вызывает исключение, если тип недоступен.

Создание сериализаторов для всех подтипов

Добавление KnownBaseTypeAttribute в интерфейс или класс указывает генератору кода создать код сериализации для всех типов, наследующих и реализующих этот тип.

Создание кода для всех типов в другой сборке

Существуют случаи, когда созданный код не может быть включен в определенную сборку во время сборки. Например, это может включать общие библиотеки, не ссылающиеся Orleansна них, сборки, написанные на языках, отличных от C#, и сборки, в которых разработчик не имеет исходного кода. В этих случаях созданный код для этих сборок можно поместить в отдельную сборку, на которую ссылается во время инициализации.

Чтобы включить эту функцию для сборки, выполните указанные ниже действия.

  1. Создайте проект C#.
  2. Microsoft.Orleans.CodeGenerator.MSBuild Установите или Microsoft.Orleans.OrleansCodeGenerator.Build пакет.
  3. Добавьте ссылку на целевую сборку.
  4. Добавьте [assembly: KnownAssembly("OtherAssembly")] на верхнем уровне файла C#.

Генератор KnownAssemblyAttribute кода указывает генератору кода проверить указанную сборку и создать код для типов в нем. Атрибут можно использовать несколько раз в проекте.

После этого созданную сборку необходимо добавить в клиент или silo во время инициализации:

builder.ConfigureApplicationParts(
    parts => parts.AddApplicationPart("CodeGenAssembly"));

В приведенном выше примере builder может быть экземпляр любого ISiloHostBuilder или IClientBuilder.

KnownAssemblyAttribute имеет необязательное свойство, TreatTypesAsSerializableкоторое можно задать true для указания генератору кода действовать так, как будто все типы в этой сборке помечены как сериализуемые.