решены баги и один шаг до обратного вызова

This commit is contained in:
2025-02-18 12:14:51 +03:00
parent 633e179131
commit 794c64aacb
9 changed files with 54 additions and 21 deletions
+6 -1
View File
@@ -18,8 +18,8 @@ public class PrinterFactory : IPrinterFactory
public void Register(SharedObject<IPrinter> printer)
{
Console.WriteLine("Registered printer");
_printers.Add(printer.Value);
Console.WriteLine("Registered printer");
}
public SharedObject<IPrinter> GetPrinterByName(string printerName)
@@ -28,6 +28,11 @@ public class PrinterFactory : IPrinterFactory
return new SharedObject<IPrinter>(_printers.Find(i => i.GetName() == printerName)!);
}
public SharedObject<IPrinter> GetFirstPrinter()
{
return new SharedObject<IPrinter>(_printers.First());
}
public string[] CollectAllNames()
{
Console.WriteLine("Collecting all printers");
+5 -1
View File
@@ -39,11 +39,15 @@ var printer = factory.Create("Test");
var name = printer.Value.GetName();
Console.WriteLine("Printer name : {0}", name);
Console.WriteLine("Registered printer");
factory.Register(new SharedObject<IPrinter>(new ClientBasedPrinter()));
Console.WriteLine("Registered printer");
var registred = factory.GetFirstPrinter();
Console.WriteLine(registred.Value);
Console.WriteLine("Collecting all printers");
var names = factory.CollectAllNames();
Console.WriteLine(names);
Console.ReadLine();
// var page = await printer.Value.Print("Test Page", new CancellationToken());
+1
View File
@@ -11,6 +11,7 @@ public interface IPrinterFactory
SharedObject<IPrinter> Create(string printerName);
void Register(SharedObject<IPrinter> printer);
SharedObject<IPrinter> GetPrinterByName(string printerName);
SharedObject<IPrinter> GetFirstPrinter();
string[] CollectAllNames();
}
+7 -3
View File
@@ -20,8 +20,12 @@ public interface ISerialisationModule : IInjectableModule
public interface IRepresentationModule : IInjectableModule
{
int Id { get; }
Task<T> GetMessage<T>(Guid? requestId = null, MessageType? messageType = null);
Task<T> GetMessageAsync<T>(Guid? requestId = null, MessageType? messageType = null);
T GetMessage<T>(Guid? requestId = null, MessageType? messageType = null);
Task<byte[]> GetRawMessage(Guid? requestId = null, MessageType? messageType = null);
Task PostCallMessage<T>(Guid id, MessageType messageType, T payload);
Task PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType);
Task PostCallMessageAsync<T>(Guid id, MessageType messageType, T payload);
Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType);
void PostCallMessage<T>(Guid id, MessageType messageType, T payload);
void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType);
}
@@ -12,6 +12,7 @@ public class ConnectionHub : IConnectionHub
if (_serializationToolkit is null)
throw new NullReferenceException("Serialization toolkit is null");
_connections.Add(interaction.ConnectionId, interaction);
var module = new RepresentationModule();
module.Inject(_serializationToolkit);
module.Inject(interaction);
@@ -1,5 +1,6 @@
using mROA.Abstract;
using mROA.Implementation.Backend;
// ReSharper disable MethodHasAsyncOverload
namespace mROA.Implementation.Frontend;
@@ -46,6 +47,8 @@ public class RequestExtractor : IRequestExtractor
if (_methodRepository == null)
throw new NullReferenceException("Method repository is null.");
await Task.Yield();
var multiClientOwnershipRepository = TransmissionConfig.OwnershipRepository as MultiClientOwnershipRepository;
@@ -56,7 +59,7 @@ public class RequestExtractor : IRequestExtractor
while (true)
{
var request =
await _representationModule!.GetMessage<DefaultCallRequest>(messageType: MessageType.CallRequest);
_representationModule!.GetMessage<DefaultCallRequest>(messageType: MessageType.CallRequest);
if (request.Parameter is not null)
{
@@ -72,7 +75,7 @@ public class RequestExtractor : IRequestExtractor
? MessageType.FinishedCommandExecution
: MessageType.ExceptionCommandExecution;
await _representationModule.PostCallMessage(request.CallRequestId, resultType, result);
_representationModule.PostCallMessage(request.CallRequestId, resultType, result, result.GetType());
}
}
catch
+6 -6
View File
@@ -20,13 +20,13 @@ public abstract class RemoteObjectBase
{
var request = new DefaultCallRequest
{ CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() };
await _representationModule.PostCallMessage(request.CallRequestId, MessageType.CallRequest, request);
await _representationModule.PostCallMessageAsync(request.CallRequestId, MessageType.CallRequest, request);
var successResponse =
_representationModule.GetMessage<FinalCommandExecution<T>>(
_representationModule.GetMessageAsync<FinalCommandExecution<T>>(
messageType: MessageType.FinishedCommandExecution, requestId: request.CallRequestId);
var errorResponse =
_representationModule.GetMessage<ExceptionCommandExecution>(
_representationModule.GetMessageAsync<ExceptionCommandExecution>(
messageType: MessageType.ExceptionCommandExecution, requestId: request.CallRequestId);
Task.WaitAny(successResponse, errorResponse);
@@ -40,13 +40,13 @@ public abstract class RemoteObjectBase
{
var request = new DefaultCallRequest
{ CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() };
await _representationModule.PostCallMessage(request.CallRequestId, MessageType.CallRequest, request);
await _representationModule.PostCallMessageAsync(request.CallRequestId, MessageType.CallRequest, request);
var successResponse =
_representationModule.GetMessage<FinalCommandExecution>(
_representationModule.GetMessageAsync<FinalCommandExecution>(
messageType: MessageType.FinishedCommandExecution, requestId: request.CallRequestId);
var errorResponse =
_representationModule.GetMessage<ExceptionCommandExecution>(
_representationModule.GetMessageAsync<ExceptionCommandExecution>(
messageType: MessageType.ExceptionCommandExecution, requestId: request.CallRequestId);
Task.WaitAny(successResponse, errorResponse);
+19 -4
View File
@@ -22,11 +22,16 @@ public class RepresentationModule : IRepresentationModule
public int Id => _interaction.ConnectionId;
public async Task<T> GetMessage<T>(Guid? requestId, MessageType? messageType)
public async Task<T> GetMessageAsync<T>(Guid? requestId, MessageType? messageType)
{
return _serialization.Deserialize<T>(await GetRawMessage(requestId, messageType))!;
}
public T GetMessage<T>(Guid? requestId = null, MessageType? messageType = null)
{
return _serialization.Deserialize<T>(GetRawMessage(requestId, messageType).GetAwaiter().GetResult())!;
}
public async Task<byte[]> GetRawMessage(Guid? requestId = null, MessageType? messageType = null)
{
while (true)
@@ -38,14 +43,24 @@ public class RepresentationModule : IRepresentationModule
}
}
public async Task PostCallMessage<T>(Guid id, MessageType messageType, T payload)
public async Task PostCallMessageAsync<T>(Guid id, MessageType messageType, T payload)
{
await PostCallMessage(id, messageType, payload, typeof(T));
await PostCallMessageAsync(id, messageType, payload, typeof(T));
}
public async Task PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType)
public async Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType)
{
await _interaction.PostMessage(new NetworkMessage
{ Id = id, SchemaId = messageType, Data = _serialization.Serialize(payload, payloadType) });
}
public void PostCallMessage<T>(Guid id, MessageType messageType, T payload)
{
PostCallMessageAsync(id, messageType, payload).GetAwaiter().GetResult();
}
public void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType)
{
PostCallMessageAsync(id, messageType, payload, payloadType).GetAwaiter().GetResult();
}
}
+1 -1
View File
@@ -68,7 +68,7 @@ public class SharedObject<T> where T : notnull
_ownerId = ro.OwnerId;
_contextId = ro.Id;
}
else
_ownerId = TransmissionConfig.OwnershipRepository!.GetHostOwnershipId();
}