Delen via


Blazor: RenderTreeFrame readonly openbare velden zijn eigenschappen geworden

In ASP.NET Core 3.0 en 3.1 heeft de RenderTreeFrame struct verschillende readonly public velden weergegeven, waaronder FrameType, Sequenceen andere. In ASP.NET Core 5.0 RC1 en latere versies zijn alle readonly public velden gewijzigd in readonly public eigenschappen.

Deze wijziging heeft geen invloed op veel ontwikkelaars omdat:

  • Elke app of bibliotheek die gewoon gebruikmaakt van .razor bestanden (of zelfs handmatige RenderTreeBuilder aanroepen) om de onderdelen ervan te definiëren, verwijst niet rechtstreeks naar dit type.
  • Het RenderTreeFrame type zelf wordt beschouwd als een implementatiedetail, niet bedoeld voor gebruik buiten het kader. ASP.NET Core 3.0 en hoger bevat een analyse waarmee compilerwaarschuwingen worden aangegeven als het type rechtstreeks wordt gebruikt.
  • Zelfs als u rechtstreeks naar RenderTreeFrame verwijst, is deze wijziging binair brekend, maar niet bronbrekend. Dat wil gezegd dat uw bestaande broncode correct wordt gecompileerd en werkt. Er treedt alleen een probleem op als u compileert op basis van een .NET Core 3.x-framework en deze binaire bestanden vervolgens uitvoert op het .NET 5- of hoger-framework.

Voor discussie, zie GitHub-issue dotnet/aspnetcore#25727.

Geïntroduceerde versie

5.0 RC1

Oud gedrag

Publieke leden op RenderTreeFrame worden gedefinieerd als velden. Bijvoorbeeld renderTreeFrame.Sequence en renderTreeFrame.ElementName.

Nieuw gedrag

Openbare leden op RenderTreeFrame worden gedefinieerd als eigenschappen met dezelfde namen als eerder. Bijvoorbeeld renderTreeFrame.Sequence en renderTreeFrame.ElementName.

Als oudere vooraf gecompileerde code niet opnieuw is gecompileerd sinds deze wijziging, kan deze een uitzondering genereren die vergelijkbaar is met MissingFieldException: Field not found: 'Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType'.

Reden voor wijziging

Deze wijziging was nodig voor het implementeren van krachtige prestatieverbeteringen in de rendering van Razor-onderdelen in ASP.NET Core 5.0. Dezelfde veiligheids- en inkapselingsniveaus worden gehandhaafd.

De meeste Blazor-ontwikkelaars worden niet beïnvloed door deze wijziging. De wijziging is waarschijnlijker van invloed op bibliotheek- en pakketauteurs, maar alleen in zeldzame gevallen. Specifiek wanneer u ontwikkelt:

  • Een app en ASP.NET Core 3.x gebruiken of upgraden naar 5.0 RC1 of hoger, hoeft u uw eigen code niet te wijzigen. Als u echter afhankelijk bent van een bibliotheek die is bijgewerkt om rekening te houden met deze wijziging, moet u bijwerken naar een nieuwere versie van die bibliotheek.
  • Een bibliotheek en alleen ASP.NET Core 5.0 RC1 of hoger wilt ondersteunen, is geen actie nodig. Zorg ervoor dat uw projectbestand een <TargetFramework> waarde van net5.0 of een latere versie declareert.
  • Als u een bibliotheek hebt en ondersteuning wilt bieden voor zowel ASP.NET Core 3.x als 5.0, bepaal dan of uw code leden van een object leest RenderTreeFrame. Bijvoorbeeld evalueren someRenderTreeFrame.FrameType.
    • De meeste bibliotheken zullen RenderTreeFrame geen leden lezen, inclusief bibliotheken die .razor onderdelen bevatten. In dit geval is er geen actie nodig.
    • Als uw bibliotheek dat doet, moet u echter multiplatformgericht zijn om zowel netstandard2.1 als net5.0 te ondersteunen. Pas de volgende wijzigingen toe in uw projectbestand:
      • Vervang het bestaande <TargetFramework> element door <TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>.

      • Gebruik een verwijzing naar een voorwaardelijk Microsoft.AspNetCore.Components pakket om rekening te houden met beide versies die u wilt ondersteunen. Voorbeeld:

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

Zie dit diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement libraryvoor meer uitleg.

Betreffende API's

Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame