Bagikan melalui


Orleans pembuatan kode

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

Mengaktifkan pembuatan kode

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

GenerateSerializerAttribute Gunakan untuk menentukan bahwa jenis dimaksudkan untuk diserialisasikan dan kode serialisasi tersebut harus dihasilkan 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 serta untuk menghasilkan boilerplate, yang mengabstraksi detail implementasi pengiriman metode, penyebaran pengecualian, dan konsep runtime internal lainnya. Pembuatan kode dapat dilakukan baik saat proyek Anda sedang dibangun atau saat aplikasi Anda diinisialisasi.

Apa yang terjadi selama build?

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

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

Contoh-contoh ini menunjukkan cara menggunakan Orleans.GenerateCodeForDeclaringAssemblyAttribute, menentukan jenis dalam perakitan yang harus diperiksa dan dihasilkan oleh generator sumber.

Metode yang disukai untuk melakukan pembuatan kode adalah pada waktu build. Pembuatan kode waktu build dapat diaktifkan dengan menggunakan salah satu paket berikut:

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

Salah satu paket ini harus diinstal ke dalam 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 akan menghasilkan kode pada waktu build.

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

Diagnostik tambahan dapat dipancarkan pada waktu build dengan menentukan nilai untuk OrleansCodeGenLogLevel dalam file .csproj proyek target. Contohnya,<OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Apa yang terjadi selama inisialisasi?

Dalam Orleans 7+, tidak ada yang terjadi selama inisialisasi. Pembuatan kode dilakukan 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:

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

Dalam contoh yang telah disebutkan di atas, builder mungkin merupakan instans dari ISiloHostBuilder atau IClientBuilder. Instans opsional ILoggerFactory dapat diteruskan ke untuk WithCodeGeneration mengaktifkan pengelogan selama pembuatan kode, misalnya:

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, Anda juga dapat menerapkan IdAttribute untuk mengidentifikasi anggota secara unik. Demikian juga, Anda juga dapat menerapkan alias dengan AliasAttribute. Untuk informasi selengkapnya tentang pembuatan kode yang berpengaruh, lihat Menggunakan Orleans serialisasi.

Selama pembuatan kode, Anda dapat memengaruhi pembuatan kode untuk jenis tertentu. Kode secara otomatis dihasilkan untuk antarmuka biji-bijian, kelas biji-bijian, status biji-bijian, dan jenis yang diteruskan sebagai argumen dalam metode biji-bijian. Jika jenis tidak sesuai dengan kriteria ini, metode berikut dapat digunakan untuk memandu pembuatan kode lebih lanjut.

SerializableAttribute Menambahkan ke jenis menginstruksikan generator kode untuk menghasilkan serializer untuk jenis tersebut.

[assembly: GenerateSerializer(Type)] Menambahkan ke proyek menginstruksikan generator kode untuk memperlakukan jenis tersebut sebagai dapat diserialisasikan dan akan menyebabkan kesalahan jika serializer tidak dapat dihasilkan untuk jenis tersebut, misalnya, karena jenisnya tidak dapat diakses. Kesalahan ini akan 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

KnownBaseTypeAttribute Menambahkan ke antarmuka atau kelas menginstruksikan generator kode untuk menghasilkan kode serialisasi untuk semua jenis yang mewarisi/mengimplementasikan jenis tersebut.

Membuat kode untuk semua jenis di rakitan lain

Ada kasus di mana kode yang dihasilkan tidak dapat disertakan dalam rakitan tertentu pada waktu build. Misalnya, ini dapat mencakup pustaka bersama yang tidak mereferensikan Orleans, rakitan yang ditulis dalam bahasa selain C#, dan rakitan di mana pengembang tidak memiliki kode sumber. Dalam kasus ini, kode yang dihasilkan untuk rakitan tersebut dapat ditempatkan ke dalam rakitan terpisah yang dirujuk selama inisialisasi.

Untuk mengaktifkan ini untuk rakitan:

  1. Buat proyek C#.
  2. Microsoft.Orleans.CodeGenerator.MSBuild Pasang paket 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 dapat digunakan beberapa kali dalam proyek.

Rakitan yang dihasilkan kemudian harus ditambahkan ke klien/silo selama inisialisasi:

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

Dalam contoh yang telah disebutkan di atas, builder mungkin merupakan instans dari ISiloHostBuilder atau IClientBuilder.

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