WARUM sollten Blazor-Komponentenparameter die automatischen Eigenschaften sein?C#

Ein Treffpunkt für C#-Programmierer
Guest
 WARUM sollten Blazor-Komponentenparameter die automatischen Eigenschaften sein?

Post by Guest »

Aus der offiziellen Microsoft-Dokumentation:

Komponentenparameter sollten als auto-properties deklariert werden, was
das bedeutet Sie sollten keine benutzerdefinierte Logik in ihren Get- oder Set-Accessoren enthalten. Beispielsweise ist die folgende StartData-Eigenschaft eine
automatische Eigenschaft:

Code: Select all

[Parameter] public DateTime StartData { get; set; }
https://learn.microsoft.com/en-us/aspne ... etcore-9.0

Nun, das ist das Dogma, weil ich keine Rechtfertigung sehe.
Ich stimme zu, dass es nicht das Komplizierte geben darf Logik, aber es gibt den wichtigen Fall, in dem die einfache Logik sein muss - Es ist die Validierung.
Beispiel
Der Wert des theme-Parameters der AdmonitionBlock-Komponente muss entweder das Element von sein StandardThemes-Enumeration oder das Element der CustomThemes-Enumeration, das vor der Verwendung der AdmonitionBlock-Komponente über die Methode defineThemes definiert werden muss:

Code: Select all

public partial class AdmonitionBlock : Microsoft.AspNetCore.Components.ComponentBase

{

public static string CSS_NAMESPACE = "AdmonitionBlock";

public enum StandardThemes { regular }

protected internal static Type? CustomThemes;

public static void defineThemes(Type CustomThemes)
{
YDF_ComponentsHelper.ValidateCustomTheme(CustomThemes);
AdmonitionBlock.CustomThemes = CustomThemes;
}

protected string _theme = AdmonitionBlock.StandardThemes.regular.ToString();

[Microsoft.AspNetCore.Components.Parameter]
public object theme
{
get => this._theme;
set => YDF_ComponentsHelper.
AssignThemeIfItIsValid(value, AdmonitionBlock.CustomThemes, ref this._theme);
}

protected internal static bool mustConsiderThemesCSS_ClassesAsCommon = YDF_ComponentsHelper.areThemesCSS_ClassesCommon;

public static void considerThemesAsCommon()
{
AdmonitionBlock.mustConsiderThemesCSS_ClassesAsCommon = true;
}

[Microsoft.AspNetCore.Components.Parameter]
public bool areThemesCSS_ClassesCommon { get; set; } =
YDF_ComponentsHelper.areThemesCSS_ClassesCommon || AdmonitionBlock.mustConsiderThemesCSS_ClassesAsCommon;

}
Die Validierung wird von der ComponentsHelper-Klasse ausgeführt (nicht nur für die AdmonitionBlock -Komponente):

Code: Select all

public abstract class ComponentsHelper
{

public static bool areThemesCSS_ClassesCommon = false;

public static void ValidateCustomTheme(Type CustomThemes)
{
if (!CustomThemes.IsEnum)
{
throw new CustomYDF_ThemeIsNotEnumerationException();
}
}

public static void AssignThemeIfItIsValid(object value, Type? customThemes, ref string _theme)
{

if (value is TStandardThemes standardTheme)
{
_theme = $"{ standardTheme }";
return;
}

string stringifiedThemeValue = value.ToString() ?? "";

if (customThemes is not null)
{

Type customThemesType = customThemes;

if (customThemesType.IsEnum && Enum.GetNames(customThemesType).Contains(stringifiedThemeValue))
{
_theme = stringifiedThemeValue;
return;
}

}

throw new InvalidThemeParameterForYDF_ComponentException();

}

}
Aktualisierung
Den Ratschlägen folgend, habe ich das Thema in eine automatische Eigenschaft umgewandelt und die SetParametersAsync-Methode hinzugefügt:

Code: Select all

public partial class AdmonitionBlock : Microsoft.AspNetCore.Components.ComponentBase
{

public enum StandardThemes { regular }

protected internal static Type? CustomThemes;

public static void defineThemes(Type CustomThemes)
{
ComponentsHelper.ValidateCustomTheme(CustomThemes);
AdmonitionBlock.CustomThemes = CustomThemes;
}

[Microsoft.AspNetCore.Components.Parameter]
public object theme { get; set; } = AdmonitionBlock.StandardThemes.regular;

public string themeName =>  this.theme.ToString() ?? "";

public override Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters)
{

parameters.SetParameterProperties(this);

if (parameters.TryGetValue(nameof(this.theme), out object? value))
{
ComponentsHelper.ValidateTheme(value, AdmonitionBlock.CustomThemes);
}

return base.SetParametersAsync(ParameterView.Empty);

}

}
wobei ValidateTheme ist:

Code: Select all

public abstract class ComponentsHelper
{

public static void ValidateTheme(object? value, Type? customThemes)
{

if (value is TStandardThemes standardTheme)
{
return;
}

string stringifiedThemeValue = value?.ToString() ?? "";

if (customThemes is not null)
{

Type customThemesType = customThemes;

if (customThemesType.IsEnum && Enum.GetNames(customThemesType).Contains(stringifiedThemeValue))
{
return;
}

}

throw new InvalidThemeParameterForYDF_ComponentException();

}

}
Leider habe ich nicht verstanden, ob SetParametersAsync bei der Änderung irgendeiner Parameter aufgerufen wird oder nicht, ganz gleich, wie es aussieht. Wenn ja, entspricht die obige Logik nicht dem ersten Beispiel, da die Validierung aller Parameter für alle Parameter aufgerufen wird und Änderungen aufweist, die sich auf die Leistung auswirken.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post