Sdílet prostřednictvím


Blazor: Veřejné pole RenderTreeFrame jen pro čtení se stala vlastnostmi

V ASP.NET Core 3.0 a 3.1 RenderTreeFrame byla struktura vystavena různým readonly public polím, včetně FrameType, Sequencea dalších. V ASP.NET Core 5.0 RC1 a novějších verzích se všechna pole změnila readonly public na readonly public vlastnosti.

Tato změna neovlivní mnoho vývojářů, protože:

  • Jakákoli aplikace nebo knihovna, která jednoduše používá .razor soubory (nebo dokonce ruční RenderTreeBuilder volání) k definování jejích součástí, by tento typ přímo neodkazovala.
  • Samotný RenderTreeFrame typ se považuje za podrobnosti implementace, které nejsou určeny k použití mimo rámec. ASP.NET Core 3.0 a novější obsahuje analyzátor, který vydává upozornění kompilátoru, pokud se typ používá přímo.
  • I když na tuto změnu odkazujete RenderTreeFrame přímo, jedná se o binární chybu, ale ne o chybu zdroje. To znamená, že váš stávající zdrojový kód se zkompiluje a bude se chovat správně. K problému dojde pouze v případě, že kompilujete rozhraní .NET Core 3.x a pak tyto binární soubory spustíte v rozhraní .NET 5 nebo novějším.

Diskuzi najdete v tématu o problému GitHubu dotnet/aspnetcore#25727.

Zavedená verze

5.0 RC1

Staré chování

Veřejné členy RenderTreeFrame jsou definovány jako pole. Příklad: renderTreeFrame.Sequence a renderTreeFrame.ElementName.

Nové chování

Veřejné členy RenderTreeFrame jsou definovány jako vlastnosti se stejnými názvy jako předtím. Příklad: renderTreeFrame.Sequence a renderTreeFrame.ElementName.

Pokud se starší předkompilovaný kód od této změny nepřekompiloval, může vyvolat výjimku podobnou chybě MissingFieldException: Pole nebylo nalezeno: Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType.

Důvod změny

Tato změna byla nezbytná k implementaci vylepšení výkonu s vysokým dopadem v vykreslování komponent Razor v ASP.NET Core 5.0. Zachovají se stejné úrovně bezpečnosti a zapouzdření.

Na většinu vývojářů Blazor tato změna nemá vliv. Změna bude pravděpodobně mít vliv na knihovnu a autory balíčků, ale jen ve výjimečných případech. Konkrétně pokud vyvíjíte:

  • Aplikace a ASP.NET Core 3.x nebo upgrade na verzi 5.0 RC1 nebo novější, nemusíte měnit vlastní kód. Pokud ale závisíte na knihovně, která upgradovala na tuto změnu, musíte ji aktualizovat na novější verzi této knihovny.
  • Knihovna a chcete podporovat pouze ASP.NET Core 5.0 RC1 nebo novější, není potřeba žádná akce. Stačí zajistit, aby soubor projektu deklaruje <TargetFramework> hodnotu net5.0 nebo novější verzi.
  • Knihovna a chcete podporovat jak ASP.NET Core 3.x , tak i 5.0, určit, jestli váš kód čte všechny RenderTreeFrame členy. Například vyhodnocení someRenderTreeFrame.FrameType.
    • Většina knihoven nebude číst RenderTreeFrame členy, včetně knihoven, které obsahují .razor komponenty. V takovém případě není potřeba žádná akce.
    • Pokud to ale vaše knihovna udělá, budete muset pro podporu obou netstandard2.1 net5.0i více cílů použít více cílů. V souboru projektu použijte následující změny:
      • Nahraďte existující <TargetFramework> prvek znakem <TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>.

      • K účtu obou verzí, které chcete podporovat, použijte odkaz na podmíněný Microsoft.AspNetCore.Components balíček. Příklad:

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

Další objasnění naleznete v tomto diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement libraryčlánku .

Ovlivněná rozhraní API

Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame