Orleans kodgenerering
Före Orleans 7.0 var källgenereringen mycket mer manuell och krävde uttryckliga åtgärder för utvecklare. Från och med Orleans 7.0 är kodgenereringen automatisk och kräver ingen utvecklarintervention. Det finns dock fortfarande fall där utvecklare kanske vill påverka kodgenereringen, till exempel för att generera kod för typer som inte genereras automatiskt eller för att generera kod för typer i en annan sammansättning.
Aktivera kodgenerering
Orleans genererar C#-källkod för din app vid byggtiden. Alla projekt, inklusive din värd, måste ha rätt NuGet-paket installerade för att aktivera kodgenerering. Följande paket är tillgängliga:
- Alla klienter bör referera till Microsoft.Orleans. Klient.
- Alla silor (servrar) bör referera till Microsoft.Orleans. Server.
- Alla andra paket bör referera till Microsoft.Orleans. Sdk.
GenerateSerializerAttribute Använd för att ange att typen är avsedd att serialiseras och att serialiseringskoden ska genereras för typen. Mer information finns i Använda Orleans serialisering.
Körningen Orleans använder genererad kod för att säkerställa korrekt serialisering av typer som används i klustret samt för att generera pannplåt, vilket sammanfattar implementeringsinformationen för metodleverans, undantagsspridning och andra interna körningskoncept. Kodgenerering kan utföras antingen när dina projekt skapas eller när programmet initieras.
Vad händer under bygget?
Vid bygget Orleans genererar kod för alla typer som är markerade med GenerateSerializerAttribute. Om en typ inte är markerad med GenerateSerializer
kommer den inte att serialiseras av Orleans.
Om du utvecklar med F# eller Visual Basic kan du också använda kodgenerering. Mer information finns i följande exempel:
De här exemplen Orleans.GenerateCodeForDeclaringAssemblyAttributevisar hur du använder , anger typer i sammansättningen som källgeneratorn ska inspektera och generera källa för.
Den bästa metoden för att utföra kodgenerering är vid byggtiden. Skapa tidskodgenerering kan aktiveras med något av följande paket:
- Microsoft.Orleans. OrleansCodeGenerator.Build. Ett paket som använder Roslyn för kodgenerering och använder .NET Reflection för analys.
- Microsoft.Orleans. CodeGenerator.MSBuild. Ett nytt kodgenereringspaket som utnyttjar Roslyn både för kodgenerering och kodanalys. Den läser inte in programbinärfiler och undviker därför problem som orsakas av motstridiga beroendeversioner och olika målramverk. Den nya kodgeneratorn förbättrar också stödet för inkrementella versioner, vilket bör resultera i kortare byggtider.
Ett av dessa paket bör installeras i alla projekt som innehåller korn, korngränssnitt, anpassade serialiserare eller typer som skickas mellan korn. När du installerar ett paket matas ett mål in i projektet som genererar kod vid bygget.
Båda paketen (Microsoft.Orleans.CodeGenerator.MSBuild
och Microsoft.Orleans.OrleansCodeGenerator.Build
) stöder endast C#-projekt. Andra språk stöds antingen med hjälp av paketet Microsoft.Orleans.OrleansCodeGenerator
som beskrivs nedan eller genom att skapa ett C#-projekt som kan fungera som mål för kod som genereras från sammansättningar som skrivits på andra språk.
Ytterligare diagnostik kan genereras vid byggtiden genom att ange ett värde för OrleansCodeGenLogLevel
i målprojektets .csproj-fil . Exempel: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>
Vad händer under initieringen?
I Orleans 7+ händer ingenting under initieringen. Kodgenereringen utförs vid bygget.
Kodgenerering kan utföras under initieringen på klienten och silon genom att Microsoft.Orleans.OrleansCodeGenerator
installera paketet och använda ApplicationPartManagerCodeGenExtensions.WithCodeGeneration tilläggsmetoden:
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration());
I föregående exempel builder
kan vara en instans av antingen ISiloHostBuilder eller IClientBuilder.
En valfri ILoggerFactory instans kan skickas till för att aktivera loggning under kodgenereringen, till WithCodeGeneration
exempel:
ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration(codeGenLoggerFactory));
Påverka kodgenerering
När du tillämpar GenerateSerializerAttribute på en typ kan du även använda för IdAttribute att unikt identifiera medlemmen. På samma sätt kan du även använda ett alias med AliasAttribute. Mer information om hur du påverkar kodgenerering finns i Använda Orleans serialisering.
Under kodgenereringen kan du påverka genereringen av kod för en viss typ. Kod genereras automatiskt för korngränssnitt, kornklasser, korntillstånd och typer som skickas som argument i kornmetoder. Om en typ inte passar dessa kriterier kan följande metoder användas för att ytterligare vägleda kodgenerering.
Om du lägger SerializableAttribute till en typ instrueras kodgeneratorn att generera en serialiserare för den typen.
Om du lägger [assembly: GenerateSerializer(Type)]
till i ett projekt instrueras kodgeneratorn att behandla den typen som serialiserbar och orsakar ett fel om en serialiserare inte kunde genereras för den typen, till exempel eftersom typen inte är tillgänglig. Det här felet stoppar en version om kodgenereringen är aktiverad. Det här attributet gör det också möjligt att generera kod för specifika typer från en annan sammansättning.
[assembly: KnownType(Type)]
instruerar också kodgeneratorn att inkludera en viss typ (som kan komma från en refererad sammansättning), men orsakar inget undantag om typen inte är tillgänglig.
Generera serialiserare för alla undertyper
Om du lägger KnownBaseTypeAttribute till i ett gränssnitt eller en klass instrueras kodgeneratorn att generera serialiseringskod för alla typer som ärver/implementerar den typen.
Generera kod för alla typer i en annan sammansättning
Det finns fall där genererad kod inte kan inkluderas i en viss sammansättning vid byggtiden. Detta kan till exempel omfatta delade bibliotek som inte refererar till Orleans, sammansättningar som skrivits på andra språk än C# och sammansättningar där utvecklaren inte har källkoden. I dessa fall kan genererad kod för dessa sammansättningar placeras i en separat sammansättning som refereras under initieringen.
Så här aktiverar du detta för en sammansättning:
- Skapa ett C#-projekt.
Microsoft.Orleans.CodeGenerator.MSBuild
Installera paketet ellerMicrosoft.Orleans.OrleansCodeGenerator.Build
.- Lägg till en referens till målsammansättningen.
- Lägg till
[assembly: KnownAssembly("OtherAssembly")]
på den översta nivån i en C#-fil.
KnownAssemblyAttribute Instruerar kodgeneratorn att inspektera den angivna sammansättningen och generera kod för typerna i den. Attributet kan användas flera gånger i ett projekt.
Den genererade sammansättningen måste sedan läggas till i klienten/silon under initieringen:
builder.ConfigureApplicationParts(
parts => parts.AddApplicationPart("CodeGenAssembly"));
I föregående exempel builder
kan vara en instans av antingen ISiloHostBuilder eller IClientBuilder.
KnownAssemblyAttribute
har en valfri egenskap, TreatTypesAsSerializable, som kan anges till för att true
instruera kodgeneratorn att fungera som om alla typer i sammansättningen har markerats som serialiserbara.