Blazor: RenderTreeFrame salt okunur genel alanlar özellik haline geldi

ASP.NET Core 3.0 ve 3.1'de RenderTreeFrame yapısı, , Sequenceve diğerleri gibi FrameTypeçeşitli readonly public alanları kullanıma sunar. ASP.NET Core 5.0 RC1 ve sonraki sürümlerinde tüm readonly public alanlar özelliklere readonly public değiştirildi.

Bu değişiklik aşağıdakilerden dolayı birçok geliştiriciyi etkilemez:

  • Bileşenlerini tanımlamak için yalnızca dosyaları (hatta el ile RenderTreeBuilder çağrıları) kullanan .razor herhangi bir uygulama veya kitaplık bu türe doğrudan başvurmaz.
  • Türün RenderTreeFrame kendisi, çerçeve dışında kullanılmak üzere tasarlanmamış bir uygulama ayrıntısı olarak kabul edilir. ASP.NET Core 3.0 ve üzeri, tür doğrudan kullanılıyorsa derleyici uyarıları veren bir çözümleyici içerir.
  • Doğrudan başvuruda RenderTreeFrame bulunursanız bile, bu değişiklik ikili hataya neden olur ancak kaynak kırılmaz. Başka bir ifadeyle, mevcut kaynak kodunuz derlenir ve düzgün şekilde davranır. Yalnızca bir .NET Core 3.x çerçevesiyle derlenirken ve sonra bu ikili dosyaları .NET 5 veya sonraki bir çerçevede çalıştırırken bir sorunla karşılaşırsınız.

Tartışma için bkz. GitHub sorunu dotnet/aspnetcore#25727.

Sürüm kullanıma sunulmuştur

5.0 RC1

Eski davranış

üzerindeki RenderTreeFrame ortak üyeler alan olarak tanımlanır. Örneğin, renderTreeFrame.Sequence ve renderTreeFrame.ElementName.

Yeni davranış

üzerindeki RenderTreeFrame ortak üyeler, önceki adlarla aynı adlara sahip özellikler olarak tanımlanır. Örneğin, renderTreeFrame.Sequence ve renderTreeFrame.ElementName.

Bu değişiklik sonrasında önceden derlenmiş eski kod yeniden derlenmemişse, MissingFieldException: Alan bulunamadı: 'Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType' benzeri bir özel durum oluşturabilir.

Değişiklik nedeni

Bu değişiklik, ASP.NET Core 5.0'da Razor bileşeni işlemesinde yüksek etkili performans geliştirmeleri uygulamak için gerekliydi. Aynı güvenlik ve kapsülleme düzeyleri korunur.

Blazor geliştiricilerinin çoğu bu değişiklikten etkilenmez. Değişikliğin kitaplık ve paket yazarlarını etkileme olasılığı daha yüksektir, ancak yalnızca nadir durumlarda. Özellikle, geliştiriyorsanız:

  • Bir uygulama ve ASP.NET Core 3.x veya 5.0 RC1 veya sonraki bir sürüme yükseltme kullanarak kendi kodunuzu değiştirmeniz gerekmez. Ancak, bu değişikliği hesaba eklemek üzere yükseltilen bir kitaplığa bağımlıysanız, bu kitaplığın daha yeni bir sürümüne güncelleştirmeniz gerekir.
  • Yalnızca Core 5.0 RC1 veya sonraki ASP.NET desteklemek isteyen bir kitaplık, hiçbir eyleme gerek yoktur. Proje dosyanızın veya sonraki bir <TargetFramework> sürümün net5.0 değerini bildirdiğinden emin olun.
  • Hem ASP.NET Core 3.x hem de 5.0'ı desteklemek isteyen bir kitaplık, kodunuzun üyeleri RenderTreeFrame okuyup okumadığını belirler. Örneğin, değerini değerlendirmek someRenderTreeFrame.FrameType.
    • Çoğu kitaplık, bileşen içeren .razor kitaplıklar da dahil olmak üzere üyeleri okumazRenderTreeFrame. Bu durumda herhangi bir eylem gerekmez.
    • Ancak kitaplığınız bunu yaparsa hem net5.0hem de netstandard2.1 'yi desteklemek için çok hedefli olmanız gerekir. Proje dosyanıza aşağıdaki değişiklikleri uygulayın:
      • Var olan <TargetFramework> öğesini ile <TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>değiştirin.

      • Desteklemek istediğiniz her iki sürümü de hesaba eklemek için koşullu Microsoft.AspNetCore.Components paket başvurusu kullanın. Örneğin:

        <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'" />
        

Daha fazla açıklama için bu diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement librarybölümüne bakın.

Etkilenen API’ler

Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame