Sdílet prostřednictvím


Orleans Generování kódu

Před Orleans 7.0 bylo generování zdroje ručnější a vyžadovalo explicitní zásah vývojáře. Orleans Od verze 7.0 je generování kódu automatické a obvykle nevyžaduje žádný zásah. Existují však případy, kdy může být žádoucí ovlivnit generování kódu, například generovat kód pro typy, které nejsou automaticky generovány nebo pro typy v jiném sestavení.

Povolení generování kódu

Orleans generuje zdrojový kód jazyka C# pro aplikaci v době sestavení. Všechny projekty, včetně hostitele, potřebují nainstalované příslušné balíčky NuGet, aby se povolilo generování kódu. K dispozici jsou následující balíčky:

GenerateSerializerAttribute Použijte k určení, že typ je určen pro serializaci a který Orleans by měl generovat serializační kód pro něj. Další informace naleznete v tématu Použití Orleans serializace.

Modul Orleans runtime používá vygenerovaný kód k zajištění správné serializace typů používaných v clusteru a k vygenerování šablonového kódu. Tato šablona abstrahuje podrobnosti implementace odesílání metod, propagace výjimek a dalších interních konceptů běhového prostředí. Generování kódu lze provést buď při sestavování projektů, nebo při inicializaci aplikace.

Generování kódu v době sestavení

Při sestavování Orleans vygeneruje kód pro všechny typy označené GenerateSerializerAttribute. Pokud není typ označený GenerateSerializer, Orleans nebude ho serializovat.

Pokud vyvíjíte pomocí jazyka F# nebo Visual Basic, můžete také použít generování kódu. Další informace najdete v těchto ukázkách:

Tyto příklady ukazují použití Orleans.GenerateCodeForDeclaringAssemblyAttribute, určení typů v sestavení pro zdrojový generátor pro kontrolu a generování zdrojového kódu.

Upřednostňovaná metoda pro generování kódu je v době sestavení. Povolte generování kódu v době sestavení pomocí jednoho z následujících balíčků:

  • Microsoft.Orleans.OrleansCodeGenerator.Build: Balíček, který používá Roslyn pro generování kódu a reflexi .NET pro analýzu.
  • Microsoft.Orleans.CodeGenerator.MSBuild: Novější balíček generování kódu využívající Roslyn pro generování kódu i analýzu. Nenačítá binární soubory aplikací, zabrání problémům způsobeným kolidujícími verzemi závislostí a rozdílovými cílovými architekturami. Tento generátor kódu také zlepšuje podporu přírůstkových sestavení, což vede k kratší době sestavení.

Nainstalujte jeden z těchto balíčků do všech projektů obsahujících zrnka, rozhraní zrn, vlastní serializátory nebo typy odesílané mezi zrny. Nainstalování balíčku vloží cíl do projektu, který generuje kód při sestavování.

Oba balíčky (Microsoft.Orleans.CodeGenerator.MSBuild i Microsoft.Orleans.OrleansCodeGenerator.Build) podporují pouze projekty jazyka C#. Podporu jiných jazyků buď pomocí Microsoft.Orleans.OrleansCodeGenerator balíčku (popsaného níže), nebo vytvořením projektu jazyka C#, který funguje jako cíl pro kód vygenerovaný ze sestavení napsaných v jiných jazycích.

V době sestavení vygenerujte další diagnostiku zadáním hodnoty OrleansCodeGenLogLevel v souboru .csproj cílového projektu. Například: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Generování kódu v čase inicializace

Během Orleans inicializace se během inicializace nic nestane. Generování kódu probíhá pouze v době sestavení.

Generování kódu lze provést během inicializace klienta a silo instalací Microsoft.Orleans.OrleansCodeGenerator balíčku a použitím ApplicationPartManagerCodeGenExtensions.WithCodeGeneration metody rozšíření:

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

V předchozím příkladu builder může být instance buď ISiloHostBuilder nebo IClientBuilder. Předejte volitelnou instanci ILoggerFactory k WithCodeGeneration, abyste povolili protokolování během generování kódu, například:

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

Vliv na generování kódu

Při použití GenerateSerializerAttribute na typ lze IdAttribute také použít k jedinečné identifikaci člena. Podobně lze alias použít pomocí .AliasAttribute Další informace o ovlivnění generování kódu naleznete v tématu Použití Orleans serializace.

Během generování kódu může být generování kódu pro určitý typ ovlivněno. Orleans automaticky vygeneruje kód pro rozhraní grain, třídy zrnitosti, stav zrnitosti a typy předané jako argumenty v metodách zrna. Pokud typ nevyhovuje těmto kritériím, použijte následující metody pro další usměrnění generování kódu.

Přidání SerializableAttribute do typu dává generátoru kódu pokyn, aby pro něj vygeneroval serializátor.

Přidání [assembly: GenerateSerializer(Type)] do projektu dává generátoru kódu pokyn, aby tento typ zpracovával jako serializovatelný. Způsobí chybu, pokud pro tento typ nelze vygenerovat serializátor (například proto, že typ není přístupný). Tato chyba zastaví sestavení, pokud je povolené generování kódu. Tento atribut také umožňuje generovat kód pro konkrétní typy z jiného sestavení.

[assembly: KnownType(Type)] také dává generátoru kódu pokyn, aby zahrnoval určitý typ (který může být z odkazovaného sestavení), ale nezpůsobí výjimku, pokud je typ nepřístupný.

Generování serializátorů pro všechny podtypy

Přidání KnownBaseTypeAttribute do rozhraní nebo třídy dává generátoru kódu pokyn, aby vygeneroval serializační kód pro všechny typy dědící z tohoto typu nebo implementoval tento typ.

Generování kódu pro všechny typy v jiném sestavení

Někdy nelze vygenerovaný kód zahrnout do konkrétního sestavení v době sestavení. Mezi příklady patří sdílené knihovny, které neodkazují Orleans, sestavení napsaná v jiných jazycích než C# a sestavení, pro která zdrojový kód není k dispozici. V těchto případech umístěte vygenerovaný kód pro tato sestavení do samostatného sestavení, na který se odkazuje během inicializace.

Povolení pro sestavení:

  1. Vytvořte projekt jazyka C#.
  2. Nainstalujte balíček Microsoft.Orleans.CodeGenerator.MSBuild nebo Microsoft.Orleans.OrleansCodeGenerator.Build.
  3. Přidejte odkaz na cílové sestavení.
  4. Přidejte [assembly: KnownAssembly("OtherAssembly")] na nejvyšší úroveň souboru C#.

Dává KnownAssemblyAttribute generátoru kódu pokyn, aby zkontroloval zadané sestavení a vygeneroval kód pro typy v něm. Tento atribut lze použít vícekrát v rámci projektu.

Potom během inicializace přidejte vygenerované sestavení do klienta/silo:

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

V předchozím příkladu builder může být instance buď ISiloHostBuilder nebo IClientBuilder.

KnownAssemblyAttributemá volitelnou vlastnost . TreatTypesAsSerializable Nastavte na true a instruujte generátor kódu, aby fungoval, jako by všechny typy v rámci tohoto sestavení byly označeny jako serializovatelné.