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í.
Doporučená akce
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>
hodnotunet5.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.0
i 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'" />
- Většina knihoven nebude číst
Další objasnění naleznete v tomto diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement
libraryčlánku .