Sdílet prostřednictvím


Orleans Generování kódu

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

Povolení generování kódu

Orleans generuje zdrojový kód jazyka C# pro vaši aplikaci v době sestavení. Všechny projekty, včetně vašeho hostitele, musí mít nainstalované příslušné balíčky NuGet, aby bylo možné generování kódu povolit. K dispozici jsou následující balíčky:

GenerateSerializerAttribute Slouží k určení, že typ je určen k serializaci a že kód serializace by měl být generován pro typ. Další informace naleznete v tématu Použití Orleans serializace.

Modul Orleans runtime využívá vygenerovaný kód k zajištění správné serializace typů, které se používají v clusteru, a také pro generování často používaných objektů, které abstrahují podrobnosti implementace expedice metod, šíření výjimek a dalších interních konceptů modulu runtime. Generování kódu je možné provést buď při vytváření projektů, nebo při inicializaci aplikace.

Co se stane během sestavování?

V době Orleans sestavení vygeneruje kód pro všechny typy, které jsou označeny GenerateSerializerAttribute. Pokud není typ označený GenerateSerializer, nebude serializován .Orleans

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

Tyto příklady ukazují, jak využívat Orleans.GenerateCodeForDeclaringAssemblyAttribute, určení typů v sestavení, pro které by měl generátor zdroje kontrolovat a generovat zdroj.

Upřednostňovaná metoda pro provádění generování kódu je v době sestavení. Generování kódu doby sestavení může být povoleno pomocí jednoho z následujících balíčků:

  • Microsoft.Orleans.OrleansCodeGenerator.Build. Balíček, který používá Roslyn ke generování kódu a k analýze používá rozhraní .NET Reflexe ion.
  • Microsoft.Orleans. CodeGenerator.MSBuild. Nový balíček generování kódu, který využívá Roslyn jak pro generování kódu, tak pro analýzu kódu. Nenačítá binární soubory aplikací a v důsledku toho se vyhne problémům způsobeným kolidujícími verzemi závislostí a rozdílovými cílovými architekturami. Nový generátor kódu také zlepšuje podporu přírůstkových sestavení, což by mělo vést k kratším časům sestavení.

Jeden z těchto balíčků by měl být nainstalován do všech projektů, které obsahují zrnka, rozhraní zrn, vlastní serializátory nebo typy odesílané mezi zrny. Instalace balíčku vloží cíl do projektu, který vygeneruje kód v době sestavení.

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

Další diagnostiku je možné v době sestavení vygenerovat zadáním hodnoty OrleansCodeGenLogLevel v souboru .csproj cílového projektu. Například <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Co se stane během inicializace?

Během Orleans inicializace se během inicializace nic nestane. Generování kódu se provádí 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 instancí buď ISiloHostBuilder nebo IClientBuilder. ILoggerFactory Volitelnou instanci je možné předat, aby WithCodeGeneration se protokolování povolilo 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 u typu můžete také použít IdAttribute k jednoznačné identifikaci člena. Podobně můžete také použít alias s 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ůžete ovlivnit generování kódu pro určitý typ. Kód se automaticky vygeneruje pro rozhraní agregace, třídy zrnitosti, stav zrnitosti a typy předané jako argumenty v metodách agregace. Pokud typ nevyhovuje těmto kritériím, můžete k dalšímu generování kódu použít následující metody.

Přidání SerializableAttribute do typu dává generátoru kódu pokyn, aby pro tento typ 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ý a způsobí chybu, pokud serializátor nelze vygenerovat pro tento typ, například kvůli tomu, ž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 generovat serializační kód pro všechny typy, které dědí nebo implementují tento typ.

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

Existují případy, kdy vygenerovaný kód nelze zahrnout do konkrétního sestavení v době sestavení. Může to například zahrnovat sdílené knihovny, které neodkazují Orleans, sestavení napsaná v jiných jazycích než C# a sestavení, ve kterých vývojář nemá zdrojový kód. V těchto případech lze vygenerovaný kód pro tato sestavení umístit do samostatného sestavení, na které se odkazuje během inicializace.

Povolení pro sestavení:

  1. Vytvořte projekt jazyka C#.
  2. Microsoft.Orleans.CodeGenerator.MSBuild Nainstalujte balíček.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. Atribut lze v projektu použít vícekrát.

Vygenerované sestavení se pak musí během inicializace přidat do klienta nebo silo:

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

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

KnownAssemblyAttribute má volitelnou vlastnost, kterou lze nastavit tak, TreatTypesAsSerializableaby true generátor kódu fungoval, jako by všechny typy v rámci tohoto sestavení byly označeny jako serializovatelné.