From ccb9f8350e211891504b952894600454873c069a Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 9 Oct 2025 07:26:42 +0200 Subject: [PATCH] add better initialization --- Pilz.Net/Api/ApiServer.cs | 22 ++++++++++++++++++--- Pilz.Net/Api/IApiHandlerInitializer.cs | 2 +- Pilz.Net/Api/IApiServer.cs | 1 + Pilz.Net/Api/Server/BaseChildItemHandler.cs | 4 ++-- Pilz.Net/Api/Server/BaseHandler.cs | 15 +++++++++++++- Pilz.Net/Api/Server/BaseItemHandler.cs | 4 ++-- Pilz.Net/Pilz.Net.csproj | 2 +- 7 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Pilz.Net/Api/ApiServer.cs b/Pilz.Net/Api/ApiServer.cs index 62887ea..739565f 100644 --- a/Pilz.Net/Api/ApiServer.cs +++ b/Pilz.Net/Api/ApiServer.cs @@ -17,6 +17,7 @@ public class ApiServer : IApiServer public class MissingDataManagerException : Exception { } protected readonly List handlers = []; + protected readonly List handlerObjects = []; protected readonly Dictionary serializers = []; protected readonly Dictionary managers = []; protected HttpListener httpListener; @@ -25,6 +26,7 @@ public class ApiServer : IApiServer protected SemaphoreSlim? semaphore; protected bool doListen; protected bool isAutoRestarting; + protected bool initializedHandlers; public event OnCheckAuthenticationEventHandler? OnCheckAuthentication; public event OnCheckContextEventHandler? OnCheckContext; @@ -109,6 +111,7 @@ public class ApiServer : IApiServer public virtual void Start() { Log.Info("Starting listener"); + InitializeHandlers(); httpListener.Prefixes.Add(ApiUrl + "/"); doListen = true; httpListener.Start(); @@ -183,6 +186,20 @@ public class ApiServer : IApiServer semaphore.Release(); } + protected virtual void InitializeHandlers() + { + foreach (var instance in handlerObjects) + { + if (instance is IApiHandlerInitializer initializer) + initializer.Initialize(); + } + } + + public virtual T? GetHandler() + { + return handlerObjects.OfType().FirstOrDefault(); + } + public virtual Dictionary GetEndpoints() { return handlers.OrderBy(n => n.Attribute.Route).GroupBy(n => n.Attribute.Route).ToDictionary(n => n.Key, n => n.SelectMany(n => n.Attribute.Methods.OrderBy(n => n)).ToArray()); @@ -190,9 +207,8 @@ public class ApiServer : IApiServer public virtual void RegisterHandler(T instance) where T : class { - // Initialize - if (instance is IApiHandlerInitializer initializer) - initializer.Initialize(this); + if (!handlerObjects.Contains(instance)) + handlerObjects.Add(instance); // Get all public instance methods var methods = instance.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public); diff --git a/Pilz.Net/Api/IApiHandlerInitializer.cs b/Pilz.Net/Api/IApiHandlerInitializer.cs index 72aa951..932930f 100644 --- a/Pilz.Net/Api/IApiHandlerInitializer.cs +++ b/Pilz.Net/Api/IApiHandlerInitializer.cs @@ -2,5 +2,5 @@ public interface IApiHandlerInitializer { - public void Initialize(IApiServer server); + void Initialize(); } diff --git a/Pilz.Net/Api/IApiServer.cs b/Pilz.Net/Api/IApiServer.cs index 057830c..f9634d3 100644 --- a/Pilz.Net/Api/IApiServer.cs +++ b/Pilz.Net/Api/IApiServer.cs @@ -30,4 +30,5 @@ public interface IApiServer Dictionary GetEndpoints(); void Stop(bool graceful); void Restart(bool graceful); + T? GetHandler(); } diff --git a/Pilz.Net/Api/Server/BaseChildItemHandler.cs b/Pilz.Net/Api/Server/BaseChildItemHandler.cs index 668dfb4..35f7bc4 100644 --- a/Pilz.Net/Api/Server/BaseChildItemHandler.cs +++ b/Pilz.Net/Api/Server/BaseChildItemHandler.cs @@ -35,9 +35,9 @@ public abstract class BaseChildItemHandler(IApiSer protected virtual bool RegisterGetAll => true; protected virtual bool RegisterPost => true; - public override void Initialize(IApiServer server) + protected override void OnInitialize() { - base.Initialize(server); + base.OnInitialize(); var t = GetType(); if (RegisterGetAll) server.RegisterHandler(t.GetMethod(nameof(GetAll))!.CreateDelegate(this), new(RouteParent + "/{pid}" + RouteChild, "GET"), Debugger.IsAttached); diff --git a/Pilz.Net/Api/Server/BaseHandler.cs b/Pilz.Net/Api/Server/BaseHandler.cs index 22ac65c..c363455 100644 --- a/Pilz.Net/Api/Server/BaseHandler.cs +++ b/Pilz.Net/Api/Server/BaseHandler.cs @@ -17,6 +17,8 @@ public abstract class BaseHandler(IApiServer server) public ApiRequestInfo Request { get; } = reqest; } + public event EventHandler? OnDeleteItem; + /// /// Gets the base route (endpoint) for the most API calls. /// @@ -24,8 +26,18 @@ public abstract class BaseHandler(IApiServer server) protected virtual bool RegisterGet => true; protected virtual bool RegisterPut => true; protected virtual bool RegisterDelete => true; + public bool HasInitialized { get; protected set; } - public virtual void Initialize(IApiServer server) + public virtual void Initialize() + { + if (HasInitialized) + return; + + HasInitialized = true; + OnInitialize(); + } + + protected virtual void OnInitialize() { var t = GetType(); if (RegisterGet) @@ -64,6 +76,7 @@ public abstract class BaseHandler(IApiServer server) protected virtual ApiResult? OnDelete(TEntity entity) { + OnDeleteItem?.Invoke(this, entity); server.Manager.Delete(entity, true); return null; } diff --git a/Pilz.Net/Api/Server/BaseItemHandler.cs b/Pilz.Net/Api/Server/BaseItemHandler.cs index eeb5e75..f2db9ac 100644 --- a/Pilz.Net/Api/Server/BaseItemHandler.cs +++ b/Pilz.Net/Api/Server/BaseItemHandler.cs @@ -14,9 +14,9 @@ public abstract class BaseItemHandler(IApiServer server) protected virtual bool RegisterGetAll => true; protected virtual bool RegisterPost => true; - public override void Initialize(IApiServer server) + protected override void OnInitialize() { - base.Initialize(server); + base.OnInitialize(); var t = GetType(); if (RegisterGetAll) server.RegisterHandler(t.GetMethod(nameof(GetAll))!.CreateDelegate(this), new(Route, "GET"), Debugger.IsAttached); diff --git a/Pilz.Net/Pilz.Net.csproj b/Pilz.Net/Pilz.Net.csproj index 62dc04c..c46854a 100644 --- a/Pilz.Net/Pilz.Net.csproj +++ b/Pilz.Net/Pilz.Net.csproj @@ -8,7 +8,7 @@ - 2.6.11 + 2.7.0