@using System.Reflection @implements IDisposable @inject LifecycleLog Log

Probe instance @(_instanceId.ToString("N")[..8]) has Counter = @Counter (renderer @RendererInfo.Name, interactive @RendererInfo.IsInteractive, browser @OperatingSystem.IsBrowser()).

Microsoft.AspNetCore.Components @ComponentsVersion

@code { private readonly Guid _instanceId; public LifecycleProbe() { _instanceId = Guid.NewGuid(); } [Parameter] public int Counter { get; set; } private static string ComponentsVersion => typeof(ComponentBase).Assembly .GetCustomAttribute()?.InformationalVersion ?? "?"; private void Report(string method, bool? firstRender = null) => Log.Write(method, firstRender, Counter, RendererInfo.Name, RendererInfo.IsInteractive, OperatingSystem.IsBrowser(), _instanceId); public override async Task SetParametersAsync(ParameterView parameters) { Report("SetParametersAsync"); // logged before base assigns the incoming parameters await base.SetParametersAsync(parameters); } protected override void OnInitialized() => Report("OnInitialized"); protected override Task OnInitializedAsync() { Report("OnInitializedAsync"); return Task.CompletedTask; } protected override void OnParametersSet() => Report("OnParametersSet"); protected override Task OnParametersSetAsync() { Report("OnParametersSetAsync"); return Task.CompletedTask; } protected override bool ShouldRender() { Report("ShouldRender"); return true; } protected override void OnAfterRender(bool firstRender) => Report("OnAfterRender", firstRender); protected override Task OnAfterRenderAsync(bool firstRender) { Report("OnAfterRenderAsync", firstRender); return Task.CompletedTask; } public void Dispose() => Report("Dispose"); }