Partilhar via


Blazor: Os campos públicos somente leitura do RenderTreeFrame passaram a ser propriedades

No ASP.NET Core 3.0 e 3.1, o RenderTreeFrame struct expôs vários readonly public campos, incluindo FrameType, Sequence, e outros. No ASP.NET Core 5.0 RC1 e versões posteriores, todos os readonly public campos foram alterados para readonly public propriedades.

Essa alteração não afetará muitos desenvolvedores porque:

  • Qualquer aplicativo ou biblioteca que simplesmente use .razor arquivos (ou mesmo chamadas manuais RenderTreeBuilder ) para definir seus componentes não estaria fazendo referência a esse tipo diretamente.
  • O RenderTreeFrame tipo em si é considerado como um detalhe de implementação, não destinado a uso fora do quadro. ASP.NET Core 3.0 e nas versões posteriores inclui um analisador que emite avisos do compilador se o tipo estiver a ser usado diretamente.
  • Mesmo que faça referência a RenderTreeFrame diretamente, esta alteração quebra a compatibilidade binária, mas não quebra a do código fonte. Ou seja, seu código-fonte existente será compilado e se comportará corretamente. Você só encontrará um problema se compilar em uma estrutura do .NET Core 3.x e, em seguida, executar esses binários no .NET 5 ou em uma estrutura posterior.

Para discussão, consulte GitHub issue dotnet/aspnetcore#25727.

Versão introduzida

5,0 RC1

Comportamento antigo

Membros públicos em RenderTreeFrame são definidos como campos. Por exemplo, renderTreeFrame.Sequence e renderTreeFrame.ElementName.

Novo comportamento

Membros públicos em RenderTreeFrame são definidos como propriedades com os mesmos nomes que antes. Por exemplo, renderTreeFrame.Sequence e renderTreeFrame.ElementName.

Se o código pré-compilado mais antigo não tiver sido recompilado desde essa alteração, ele pode lançar uma exceção semelhante a MissingFieldException: Field not found: 'Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType'.

Motivo da mudança

Essa alteração foi necessária para implementar melhorias de desempenho de alto impacto na renderização de componentes do Razor no ASP.NET Core 5.0. Os mesmos níveis de segurança e encapsulamento são mantidos.

A maioria dos desenvolvedores Blazor não são afetados por essa alteração. É mais provável que a alteração afete os autores de bibliotecas e pacotes, mas apenas em casos raros. Especificamente, se você estiver desenvolvendo:

  • Se você estiver utilizando um aplicativo com ASP.NET Core 3.x ou fizer um upgrade para 5.0 RC1 ou posterior, não precisa alterar o seu código. No entanto, se você depender de uma biblioteca que atualizou para levar em conta essa alteração, precisará atualizar para uma versão mais recente dessa biblioteca.
  • Uma biblioteca e deseja suportar apenas ASP.NET Core 5.0 RC1 ou posterior, nenhuma ação é necessária. Apenas certifique-se de que seu arquivo de projeto declare um <TargetFramework> valor de net5.0 ou uma versão posterior.
  • Uma biblioteca e deseja oferecer suporte ao ASP.NET Core 3.x e 5.0, determine se seu código lê algum RenderTreeFrame membro. Por exemplo, avaliar someRenderTreeFrame.FrameType.
    • A maioria das bibliotecas não são capazes de ler RenderTreeFrame membros, mesmo aquelas que contêm .razor componentes. Neste caso, nenhuma ação é necessária.
    • No entanto, se a sua biblioteca fizer isso, precisará definir múltiplos alvos para suportar tanto netstandard2.1 como net5.0. Aplique as seguintes alterações no arquivo de projeto:
      • Substitua o elemento existente <TargetFramework> por <TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>.

      • Use uma referência de pacote condicional Microsoft.AspNetCore.Components para contabilizar ambas as versões que você deseja suportar. Por exemplo:

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

Veja este diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement librarydocumento para mais esclarecimentos.

APIs afetadas

Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame