begin developing a basic message based web api
This commit is contained in:
49
Pilz.Networking/Api/ApiServer.cs
Normal file
49
Pilz.Networking/Api/ApiServer.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
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)
|
||||
{
|
||||
// ...
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user