begin developing a basic message based web api

This commit is contained in:
Pilzinsel64
2024-08-14 14:59:05 +02:00
parent 1932443a20
commit 02a6c3bf6a
9 changed files with 115 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
namespace Pilz.Networking.Api;
public class ApiClient : IApiClient
{
public void MakeRequest<T>(string url, T message) where T : ApiMessage
{
// ...
}
}

View File

@@ -0,0 +1,14 @@
namespace Pilz.Networking.Api;
public abstract class ApiMessage
{
internal protected virtual string? Serialize(ApiMessage message)
{
}
internal protected virtual ApiMessage? Deserialize(string json)
{
}
}

View 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)
{
// ...
}
}

View File

@@ -0,0 +1,14 @@
namespace Pilz.Networking.Api;
public class DefaultMessageSerializer : IMessageSerializer
{
public ApiMessage? Deserialize(string json)
{
// ...
}
public string? Serialize(ApiMessage message)
{
// ...
}
}

View File

@@ -0,0 +1,6 @@
namespace Pilz.Networking.Api;
public interface IApiClient
{
void MakeRequest<T>(string url, T message) where T : ApiMessage;
}

View File

@@ -0,0 +1,7 @@
namespace Pilz.Networking.Api;
public interface IApiServer : IApiClient
{
void RegisterHandler<T>(string url, T instance) where T : class;
void RegisterHandler(string url, Delegate handler);
}

View File

@@ -0,0 +1,7 @@
namespace Pilz.Networking.Api;
public interface IMessageSerializer
{
string? Serialize(ApiMessage message);
ApiMessage? Deserialize(string json);
}

View File

@@ -0,0 +1,8 @@
namespace Pilz.Networking.Api;
[AttributeUsage(AttributeTargets.Method)]
public class MessageHandlerAttribute(string url) : Attribute
{
public string Url { get; set; } = url;
public Type? Serializer { get; set; }
}

View File

@@ -5,6 +5,7 @@
<TargetFrameworks>net8.0-windows</TargetFrameworks> <TargetFrameworks>net8.0-windows</TargetFrameworks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>