Delen via


Orleans code genereren

Vóór Orleans 7.0 was het genereren van bronnen veel handmatiger en vereist expliciete tussenkomst van ontwikkelaars. Orleans Vanaf 7.0 is het genereren van code automatisch en is er geen tussenkomst van de ontwikkelaar vereist. Er zijn echter nog steeds gevallen waarin ontwikkelaars mogelijk invloed willen hebben op het genereren van code, bijvoorbeeld om code te genereren voor typen die niet automatisch worden gegenereerd of om code te genereren voor typen in een andere assembly.

Code genereren inschakelen

Orleans genereert C#-broncode voor uw app tijdens de build. Alle projecten, inclusief uw host, moeten de juiste NuGet-pakketten hebben geïnstalleerd om het genereren van code in te schakelen. De volgende pakketten zijn beschikbaar:

Gebruik de GenerateSerializerAttribute functie om op te geven dat het type moet worden geserialiseerd en dat de serialisatiecode moet worden gegenereerd voor het type. Zie Serialisatie gebruiken Orleans voor meer informatie.

De Orleans runtime maakt gebruik van gegenereerde code om ervoor te zorgen dat de juiste serialisatie van typen die in het cluster worden gebruikt en voor het genereren van standaard, waarmee de implementatiedetails van verzending van methoden, uitzonderingsdoorgifte en andere interne runtimeconcepten worden weggenomen. Codegeneratie kan worden uitgevoerd wanneer uw projecten worden gebouwd of wanneer uw toepassing wordt geïnitialiseerd.

Wat gebeurt er tijdens de build?

Tijdens de build Orleans genereert u code voor alle typen die zijn gemarkeerd met GenerateSerializerAttribute. Als een type niet is gemarkeerd met GenerateSerializer, wordt het niet geserialiseerd door Orleans.

Als u ontwikkelt met F# of Visual Basic, kunt u ook codegeneratie gebruiken. Zie de volgende voorbeelden voor meer informatie:

In deze voorbeelden ziet u hoe u de Orleans.GenerateCodeForDeclaringAssemblyAttributetypen gebruikt in de assembly waarvoor de brongenerator bron moet inspecteren en genereren.

De voorkeursmethode voor het uitvoeren van codegeneratie is op het moment van bouwen. Het genereren van buildtijdcode kan worden ingeschakeld met behulp van een van de volgende pakketten:

  • Microsoft.Orleans. OrleansCodeGenerator.Build. Een pakket dat Roslyn gebruikt voor het genereren van code en .NET Reflection gebruikt voor analyse.
  • Microsoft.Orleans. CodeGenerator.MSBuild. Een nieuw pakket voor het genereren van code dat gebruikmaakt van Roslyn, zowel voor het genereren van code als voor codeanalyse. Er worden geen binaire toepassingsbestanden geladen. Als gevolg hiervan voorkomt u problemen die worden veroorzaakt door conflicterende afhankelijkheidsversies en verschillende doelframeworks. De nieuwe codegenerator verbetert ook de ondersteuning voor incrementele builds, wat leidt tot kortere buildtijden.

Een van deze pakketten moet worden geïnstalleerd in alle projecten die korrels, graaninterfaces, aangepaste serializers of typen bevatten die tussen korrels worden verzonden. Het installeren van een pakket injecteert een doel in het project dat code genereert tijdens de build.

Zowel pakketten (Microsoft.Orleans.CodeGenerator.MSBuild als Microsoft.Orleans.OrleansCodeGenerator.Build) ondersteunen alleen C#-projecten. Andere talen worden ondersteund met behulp van het Microsoft.Orleans.OrleansCodeGenerator hieronder beschreven pakket of door een C#-project te maken dat kan fungeren als het doel voor code die is gegenereerd op basis van assembly's die in andere talen zijn geschreven.

Aanvullende diagnostische gegevens kunnen tijdens de build worden verzonden door een waarde op te geven voor OrleansCodeGenLogLevel het .csproj-bestand van het doelproject. Bijvoorbeeld: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Wat gebeurt er tijdens de initialisatie?

In Orleans 7+ gebeurt er niets tijdens de initialisatie. Het genereren van code wordt uitgevoerd tijdens de build.

Codegeneratie kan worden uitgevoerd tijdens de initialisatie op de client en silo door het Microsoft.Orleans.OrleansCodeGenerator pakket te installeren en de ApplicationPartManagerCodeGenExtensions.WithCodeGeneration extensiemethode te gebruiken:

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

In het voorgaande voorbeeld builder kan dit een instantie zijn van of ISiloHostBuilder IClientBuilder. Een optioneel ILoggerFactory exemplaar kan worden doorgegeven om WithCodeGeneration logboekregistratie in te schakelen tijdens het genereren van code, bijvoorbeeld:

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

Codegeneratie beïnvloeden

Wanneer u een GenerateSerializerAttribute type toepast, kunt u ook het IdAttribute lid op unieke wijze identificeren. Op dezelfde manier kunt u ook een alias toepassen met de AliasAttribute. Zie Serialisatie gebruiken Orleans voor meer informatie over het beïnvloeden van codegeneratie.

Tijdens het genereren van code kunt u invloed hebben op het genereren van code voor een specifiek type. Code wordt automatisch gegenereerd voor graaninterfaces, graanklassen, graanstatus en typen die worden doorgegeven als argumenten in graanmethoden. Als een type niet aan deze criteria voldoet, kunnen de volgende methoden worden gebruikt om het genereren van code verder te begeleiden.

Als u aan een type toevoegt SerializableAttribute , wordt de codegenerator geïnstrueerd om een serializer voor dat type te genereren.

Als u aan een project toevoegt [assembly: GenerateSerializer(Type)] , wordt de codegenerator geïnstrueerd om dat type te behandelen als serializeerbaar en wordt een fout veroorzaakt als een serializer niet voor dat type kan worden gegenereerd, bijvoorbeeld omdat het type niet toegankelijk is. Met deze fout wordt een build gestopt als het genereren van code is ingeschakeld. Met dit kenmerk kunt u ook code genereren voor specifieke typen van een andere assembly.

[assembly: KnownType(Type)] geeft ook de codegenerator opdracht om een specifiek type op te nemen (dat mogelijk afkomstig is van een assembly waarnaar wordt verwezen), maar veroorzaakt geen uitzondering als het type niet toegankelijk is.

Serializers genereren voor alle subtypen

Door toe te voegen KnownBaseTypeAttribute aan een interface of klasse wordt de codegenerator geïnstrueerd om serialisatiecode te genereren voor alle typen die dat type overnemen/implementeren.

Code genereren voor alle typen in een andere assembly

Er zijn gevallen waarin gegenereerde code niet kan worden opgenomen in een bepaalde assembly tijdens de build. Dit kan bijvoorbeeld gedeelde bibliotheken bevatten die niet verwijzen naar Orleans, assembly's die zijn geschreven in andere talen dan C# en assembly's waarin de ontwikkelaar niet over de broncode beschikt. In deze gevallen kan gegenereerde code voor deze assembly's worden geplaatst in een afzonderlijke assembly waarnaar wordt verwezen tijdens de initialisatie.

Ga als volgt te werk om dit in te schakelen voor een assembly:

  1. Maak een C#-project.
  2. Installeer het Microsoft.Orleans.CodeGenerator.MSBuild of het Microsoft.Orleans.OrleansCodeGenerator.Build pakket.
  3. Voeg een verwijzing toe naar de doelassembly.
  4. Toevoegen [assembly: KnownAssembly("OtherAssembly")] op het hoogste niveau van een C#-bestand.

De KnownAssemblyAttribute codegenerator geeft de opdracht om de opgegeven assembly te inspecteren en code te genereren voor de typen hierin. Het kenmerk kan meerdere keren in een project worden gebruikt.

De gegenereerde assembly moet vervolgens tijdens de initialisatie aan de client/silo worden toegevoegd:

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

In het voorgaande voorbeeld builder kan dit een instantie zijn van of ISiloHostBuilder IClientBuilder.

KnownAssemblyAttribute heeft een optionele eigenschap, TreatTypesAsSerializabledie kan worden ingesteld om true de codegenerator te instrueren om te fungeren alsof alle typen binnen die assembly zijn gemarkeerd als serializeerbaar.