namespace LanMountainDesktop.PluginSdk; public sealed class PluginDesktopComponentEditorContext { public PluginDesktopComponentEditorContext( PluginManifest manifest, string pluginDirectory, string dataDirectory, IServiceProvider services, IReadOnlyDictionary properties, string componentId, string? placementId, IPluginSettingsService? pluginSettings, IComponentEditorHostContext hostContext) { ArgumentNullException.ThrowIfNull(manifest); ArgumentException.ThrowIfNullOrWhiteSpace(pluginDirectory); ArgumentException.ThrowIfNullOrWhiteSpace(dataDirectory); ArgumentException.ThrowIfNullOrWhiteSpace(componentId); ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(properties); ArgumentNullException.ThrowIfNull(hostContext); Manifest = manifest; PluginDirectory = pluginDirectory; DataDirectory = dataDirectory; Services = services; Properties = properties; ComponentId = componentId.Trim(); PlacementId = string.IsNullOrWhiteSpace(placementId) ? null : placementId.Trim(); PluginSettings = pluginSettings; HostContext = hostContext; } public PluginManifest Manifest { get; } public string PluginDirectory { get; } public string DataDirectory { get; } public IServiceProvider Services { get; } public IReadOnlyDictionary Properties { get; } public string ComponentId { get; } public string? PlacementId { get; } public IPluginSettingsService? PluginSettings { get; } public IComponentEditorHostContext HostContext { get; } public T? GetService() { return (T?)Services.GetService(typeof(T)); } public bool TryGetProperty(string key, out T? value) { ArgumentException.ThrowIfNullOrWhiteSpace(key); if (Properties.TryGetValue(key, out var rawValue) && rawValue is T typedValue) { value = typedValue; return true; } value = default; return false; } }