50 lines
1.6 KiB
C#
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)
|
|
{
|
|
// ...
|
|
}
|
|
}
|