Bagikan melalui


Orleans pembuatan kode

Sebelum Orleans 7.0, pembuatan sumber lebih manual dan diperlukan intervensi pengembang eksplisit. Dimulai dengan Orleans 7.0, pembuatan kode bersifat otomatis dan biasanya tidak memerlukan intervensi. Namun, kasus masih ada di mana memengaruhi proses pembuatan kode mungkin diinginkan, misalnya, untuk menghasilkan kode untuk tipe yang tidak dibuat secara otomatis atau untuk tipe di majelis lain.

Mengaktifkan pembuatan kode

Orleans menghasilkan kode sumber C# untuk aplikasi pada waktu build. Semua proyek, termasuk host, memerlukan paket NuGet yang sesuai yang diinstal untuk mengaktifkan pembuatan kode. Paket berikut tersedia:

Gunakan GenerateSerializerAttribute untuk menentukan bahwa jenis tersebut dimaksudkan untuk serialisasi dan Orleans harus menghasilkan kode serialisasi untuk jenis tersebut. Untuk informasi selengkapnya, lihat Menggunakan Orleans serialisasi.

Orleans Runtime menggunakan kode yang dihasilkan untuk memastikan serialisasi jenis yang tepat yang digunakan di seluruh kluster dan untuk menghasilkan kode boilerplate. Boilerplate ini mengabstraksi detail implementasi metode pengiriman, penyebaran pengecualian, dan konsep runtime internal lainnya. Pembuatan kode dapat dilakukan baik saat membangun proyek atau ketika aplikasi menginisialisasi.

Pembuatan kode saat proses build

Pada waktu build, Orleans menghasilkan kode untuk semua jenis yang ditandai dengan GenerateSerializerAttribute. Jika jenis tidak ditandai dengan GenerateSerializerAttribute, Orleans tidak akan menserialisasikannya.

Jika mengembangkan dengan F# atau Visual Basic, pembuatan kode juga dapat digunakan. Untuk informasi selengkapnya, lihat sampel ini:

Contoh-contoh ini menunjukkan cara menggunakan Orleans.GenerateCodeForDeclaringAssemblyAttribute, menetapkan tipe-tipe dalam perakitan assembly sehingga generator sumber dapat memeriksa dan menghasilkan kode sumber.

Metode yang disukai untuk pembuatan kode adalah pada waktu build. Aktifkan pembuatan kode build-time menggunakan salah satu paket berikut:

  • Microsoft.Orleans.OrleansCodeGenerator.Build: Paket yang menggunakan Roslyn untuk pembuatan kode dan .NET Reflection untuk analisis.
  • Microsoft.Orleans.CodeGenerator.MSBuild: Paket pembuatan kode yang lebih baru memanfaatkan Roslyn untuk pembuatan kode dan analisis. Ini tidak memuat biner aplikasi, menghindari masalah yang disebabkan oleh bentrokan versi dependensi dan kerangka kerja target yang berbeda. Generator kode ini juga meningkatkan dukungan untuk build bertambah bertahap, sehingga menghasilkan waktu build yang lebih pendek.

Instal salah satu paket ini ke semua proyek yang berisi biji-bijian, antarmuka biji-bijian, serializer kustom, atau jenis yang dikirim di antara biji-bijian. Menginstal paket menyuntikkan target ke dalam proyek yang menghasilkan kode pada waktu kompilasi.

Kedua paket (Microsoft.Orleans.CodeGenerator.MSBuild dan Microsoft.Orleans.OrleansCodeGenerator.Build) hanya mendukung proyek C#. Dukung bahasa lain baik dengan menggunakan Microsoft.Orleans.OrleansCodeGenerator paket (dijelaskan di bawah) atau dengan membuat proyek C# yang bertindak sebagai target untuk kode yang dihasilkan dari rakitan yang ditulis dalam bahasa lain.

Keluarkan diagnostik tambahan pada waktu build dengan menentukan nilai untuk OrleansCodeGenLogLevel dalam file .csproj proyek target. Misalnya: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Pembuatan kode saat inisialisasi

Dalam Orleans 7+, tidak ada yang terjadi selama inisialisasi. Pembuatan kode hanya terjadi pada waktu build.

Pembuatan kode dapat dilakukan selama inisialisasi pada klien dan silo dengan menginstal Microsoft.Orleans.OrleansCodeGenerator paket dan menggunakan ApplicationPartManagerCodeGenExtensions.WithCodeGeneration metode ekstensi:

public static void ConfigureWithCodeGeneration(ISiloHostBuilder builder)
{
    builder.ConfigureApplicationParts(
        parts => parts
            .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
            .WithCodeGeneration());
}

Dalam contoh sebelumnya, builder dapat berupa instans baik ISiloHostBuilder atau IClientBuilder. Berikan instans opsional ILoggerFactory ke WithCodeGeneration untuk mengaktifkan pencatatan selama pembuatan kode, sebagai contoh:

public static void ConfigureWithCodeGenerationLogging(ISiloHostBuilder builder)
{
    ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
    codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
    builder.ConfigureApplicationParts(
        parts => parts
            .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
            .WithCodeGeneration(codeGenLoggerFactory));
}

Memengaruhi pembuatan kode

Saat menerapkan GenerateSerializerAttribute ke jenis, IdAttribute juga dapat diterapkan untuk mengidentifikasi anggota secara unik. Demikian juga, alias dapat diterapkan menggunakan AliasAttribute. Untuk informasi selengkapnya tentang pembuatan kode yang berpengaruh, lihat Menggunakan Orleans serialisasi.

Pada saat pembuatan kode, proses pembuatan kode untuk jenis tertentu dapat mengalami pengaruh. Orleans secara otomatis menghasilkan kode untuk antarmuka grain, kelas grain, status grain, dan tipe yang diteruskan sebagai argumen dalam metode grain. Jika jenis tidak sesuai dengan kriteria ini, gunakan metode berikut untuk memandu pembuatan kode lebih lanjut.

Menambahkan SerializableAttribute ke sebuah jenis menginstruksikan generator kode untuk menghasilkan serializer untuknya.

Menambahkan [assembly: GenerateSerializer(Type)] ke proyek menginstruksikan generator kode untuk memperlakukan jenis tersebut sebagai serializable. Ini menyebabkan kesalahan jika serializer tidak dapat dihasilkan untuk jenis tersebut (misalnya, karena jenisnya tidak dapat diakses). Kesalahan ini menghentikan build jika pembuatan kode diaktifkan. Atribut ini juga memungkinkan pembuatan kode untuk jenis tertentu dari rakitan lain.

[assembly: KnownType(Type)] juga menginstruksikan generator kode untuk menyertakan jenis tertentu (yang mungkin dari rakitan yang direferensikan), tetapi tidak menyebabkan pengecualian jika jenisnya tidak dapat diakses.

Hasilkan serializer untuk semua subjenis

Menambahkan KnownBaseTypeAttribute ke dalam antarmuka atau kelas memerintahkan generator kode untuk menghasilkan kode serialisasi untuk semua tipe yang mewarisi dari atau mengimplementasikan tipe tersebut.

Membuat kode untuk semua jenis di rakitan lain

Terkadang, kode yang dihasilkan tidak dapat disertakan dalam rakitan tertentu pada waktu build. Contohnya termasuk pustaka bersama yang tidak merujuk Orleans, rakitan yang ditulis dalam bahasa selain C#, dan rakitan yang kode sumbernya tidak tersedia. Dalam kasus ini, tempatkan kode yang dihasilkan untuk rakitan tersebut ke dalam rakitan terpisah yang dirujuk selama inisialisasi.

Untuk mengaktifkan ini untuk rakitan:

  1. Buat proyek C#.
  2. Pasang paket Microsoft.Orleans.CodeGenerator.MSBuild atau Microsoft.Orleans.OrleansCodeGenerator.Build.
  3. Tambahkan referensi ke rakitan target.
  4. Tambahkan [assembly: KnownAssembly("OtherAssembly")] di tingkat atas file C#.

KnownAssemblyAttribute menginstruksikan generator kode untuk memeriksa perakitan yang ditentukan dan menghasilkan kode untuk jenis di dalamnya. Atribut ini dapat digunakan beberapa kali dalam proyek.

Kemudian, tambahkan rakitan yang dihasilkan ke klien/silo selama inisialisasi:

public static void ConfigureWithExternalAssembly(ISiloHostBuilder builder)
{
    var assembly = Assembly.Load("CodeGenAssembly");
    builder.ConfigureApplicationParts(
        parts => parts.AddApplicationPart(assembly));
}

Dalam contoh sebelumnya, builder dapat berupa instans baik ISiloHostBuilder atau IClientBuilder.

KnownAssemblyAttribute memiliki properti opsional, TreatTypesAsSerializable. Atur ini ke true untuk menginstruksikan generator kode untuk bertindak seolah-olah semua jenis dalam rakitan tersebut ditandai sebagai dapat diserialisasikan.