Bagikan melalui


Blazor: Bidang publik baca-baca RenderTreeFrame telah menjadi properti

Dalam ASP.NET Core 3.0 dan 3.1, RenderTreeFrame struktur mengekspos berbagai readonly public bidang, termasuk FrameType, Sequence, dan lainnya. Di ASP.NET Core 5.0 RC1 dan versi yang lebih baru, semua readonly public bidang berubah menjadi readonly public properti.

Perubahan ini tidak akan memengaruhi banyak pengembang karena:

  • Aplikasi atau pustaka apa pun yang hanya menggunakan .razor file (atau bahkan panggilan manual RenderTreeBuilder ) untuk menentukan komponennya tidak akan merujuk jenis ini secara langsung.
  • Jenis itu RenderTreeFrame sendiri dianggap sebagai detail implementasi, tidak dimaksudkan untuk digunakan di luar kerangka kerja. ASP.NET Core 3.0 dan yang lebih baru menyertakan penganalisis yang mengeluarkan peringatan kompilator jika jenis tersebut digunakan secara langsung.
  • Bahkan jika Anda mereferensikan RenderTreeFrame secara langsung, perubahan ini melanggar biner tetapi tidak melanggar sumber. Artinya, kode sumber Anda yang ada akan dikompilasi dan berulah dengan benar. Anda hanya akan mengalami masalah jika mengkompilasi terhadap kerangka kerja .NET Core 3.x lalu menjalankan biner tersebut terhadap .NET 5 atau kerangka kerja yang lebih baru.

Untuk diskusi, lihat Masalah GitHub dotnet/aspnetcore#25727.

Versi yang diperkenalkan

5.0 RC1

Perilaku yang lama

Anggota publik didefinisikan RenderTreeFrame sebagai bidang. Misalnya, renderTreeFrame.Sequence dan renderTreeFrame.ElementName.

Perilaku yang baru

Anggota publik didefinisikan RenderTreeFrame sebagai properti dengan nama yang sama seperti sebelumnya. Misalnya, renderTreeFrame.Sequence dan renderTreeFrame.ElementName.

Jika kode lama yang telah dikompilasi sebelumnya belum dikompilasi ulang sejak perubahan ini, kode mungkin melemparkan pengecualian yang mirip dengan MissingFieldException: Field tidak ditemukan: 'Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType'.

Alasan untuk berubah

Perubahan ini diperlukan untuk menerapkan peningkatan performa berdampak tinggi dalam rendering komponen Razor di ASP.NET Core 5.0. Tingkat keamanan dan enkapulasi yang sama dipertahankan.

Sebagian besar pengembang Blazor tidak terpengaruh oleh perubahan ini. Perubahan ini lebih mungkin memengaruhi pustaka dan penulis paket, tetapi hanya dalam kasus yang jarang terjadi. Secara khusus, jika Anda mengembangkan:

  • Aplikasi dan menggunakan ASP.NET Core 3.x atau meningkatkan ke 5.0 RC1 atau yang lebih baru, Anda tidak perlu mengubah kode Anda sendiri. Namun, jika Anda bergantung pada pustaka yang ditingkatkan untuk memperhitungkan perubahan ini, maka Anda perlu memperbarui ke versi pustaka yang lebih baru.
  • Pustaka dan hanya ingin mendukung ASP.NET Core 5.0 RC1 atau yang lebih baru, tidak ada tindakan yang diperlukan. Pastikan file proyek Anda mendeklarasikan <TargetFramework> nilai net5.0 atau versi yang lebih baru.
  • Pustaka dan ingin mendukung ASP.NET Core 3.x dan 5.0, tentukan apakah kode Anda membaca anggota mana pun RenderTreeFrame . Misalnya, mengevaluasi someRenderTreeFrame.FrameType.
    • Sebagian besar pustaka tidak akan membaca RenderTreeFrame anggota, termasuk pustaka yang berisi .razor komponen. Dalam hal ini, tidak ada tindakan yang diperlukan.
    • Namun, jika pustaka Anda melakukannya, Anda harus multi-target untuk mendukung dan netstandard2.1net5.0. Terapkan perubahan berikut dalam file proyek Anda:
      • Ganti elemen yang <TargetFramework> ada dengan <TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>.

      • Gunakan referensi paket bersyarah Microsoft.AspNetCore.Components untuk memperhitungkan kedua versi yang ingin Anda dukung. Misalnya:

        <PackageReference Include="Microsoft.AspNetCore.Components" Version="3.0.0" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
        <PackageReference Include="Microsoft.AspNetCore.Components" Version="5.0.0-rc.1.*" Condition="'$(TargetFramework)' != 'netstandard2.0'" />
        

Untuk klarifikasi lebih lanjut, lihat ini diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement library.

API yang Terpengaruh

Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame