Files
Pilz/Pilz.Networking/Api/ApiServer.cs
2024-08-14 14:59:05 +02:00

50 lines
1.6 KiB
C#

using System.Reflection;
namespace Pilz.Networking.Api;
public class ApiServer : ApiClient, IApiServer
{
protected readonly Dictionary<string, object> handlers = [];
protected readonly Dictionary<Type, IMessageSerializer> serializers = [];
public IMessageSerializer Serializer { get; set; } = new DefaultMessageSerializer();
public virtual void RegisterHandler<T>(string url, T instance) where T : class
{
var methods = typeof(T).GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (var method in methods)
{
if (method.GetCustomAttribute<MessageHandlerAttribute>() is not MessageHandlerAttribute attribute
|| method.GetParameters().FirstOrDefault() is not ParameterInfo parameterInfo
|| !parameterInfo.ParameterType.IsAssignableTo(typeof(ApiMessage)))
continue;
var serializer = Serializer;
if (attribute.Serializer is not null)
{
if (serializers.TryGetValue(attribute.Serializer, out var s) && s is not null)
serializer = s;
else if (Activator.CreateInstance(attribute.Serializer) is IMessageSerializer ss)
{
serializer = ss;
serializers.Add(attribute.Serializer, ss);
}
}
// ...
}
}
public virtual void RegisterHandler(string url, Delegate handler)
{
// ...
}
protected virtual string? HandleMessage(string url, string json)
{
// ...
}
}