begin developing a basic message based web api
This commit is contained in:
9
Pilz.Networking/Api/ApiClient.cs
Normal file
9
Pilz.Networking/Api/ApiClient.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Pilz.Networking.Api;
|
||||||
|
|
||||||
|
public class ApiClient : IApiClient
|
||||||
|
{
|
||||||
|
public void MakeRequest<T>(string url, T message) where T : ApiMessage
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Pilz.Networking/Api/ApiMessage.cs
Normal file
14
Pilz.Networking/Api/ApiMessage.cs
Normal 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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
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)
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Pilz.Networking/Api/DefaultMessageSerializer.cs
Normal file
14
Pilz.Networking/Api/DefaultMessageSerializer.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace Pilz.Networking.Api;
|
||||||
|
|
||||||
|
public class DefaultMessageSerializer : IMessageSerializer
|
||||||
|
{
|
||||||
|
public ApiMessage? Deserialize(string json)
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
public string? Serialize(ApiMessage message)
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
6
Pilz.Networking/Api/IApiClient.cs
Normal file
6
Pilz.Networking/Api/IApiClient.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Pilz.Networking.Api;
|
||||||
|
|
||||||
|
public interface IApiClient
|
||||||
|
{
|
||||||
|
void MakeRequest<T>(string url, T message) where T : ApiMessage;
|
||||||
|
}
|
||||||
7
Pilz.Networking/Api/IApiServer.cs
Normal file
7
Pilz.Networking/Api/IApiServer.cs
Normal 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);
|
||||||
|
}
|
||||||
7
Pilz.Networking/Api/IMessageSerializer.cs
Normal file
7
Pilz.Networking/Api/IMessageSerializer.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Pilz.Networking.Api;
|
||||||
|
|
||||||
|
public interface IMessageSerializer
|
||||||
|
{
|
||||||
|
string? Serialize(ApiMessage message);
|
||||||
|
ApiMessage? Deserialize(string json);
|
||||||
|
}
|
||||||
8
Pilz.Networking/Api/MessageHandlerAttribute.cs
Normal file
8
Pilz.Networking/Api/MessageHandlerAttribute.cs
Normal 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; }
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user