минирефакторинг
This commit is contained in:
@@ -3,10 +3,10 @@ using mROA.Implementation;
|
||||
|
||||
namespace Example.Backend;
|
||||
|
||||
|
||||
public class Printer : IPrinter
|
||||
{
|
||||
public string Name;
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return Name;
|
||||
@@ -15,6 +15,7 @@ public class Printer : IPrinter
|
||||
public async Task<SharedObject<IPage>> Print(string text, CancellationToken cancellationToken = default)
|
||||
{
|
||||
// throw new Exception("The method or operation is not implemented.");
|
||||
return new Page {Text = text};
|
||||
// var sharedObject = new Page { Text = text };
|
||||
return new Page { Text = text };
|
||||
}
|
||||
}
|
||||
@@ -32,7 +32,7 @@ _ = builder.GetModule<RequestExtractor>()!.StartExtraction();
|
||||
Console.WriteLine(TransmissionConfig.OwnershipRepository.GetOwnershipId());
|
||||
var context = builder.GetModule<RemoteContextRepository>();
|
||||
|
||||
var factory = context.GetSingleObject(typeof(IPrinterFactory)) as IPrinterFactory;
|
||||
var factory = context.GetSingleObject<IPrinterFactory>();
|
||||
|
||||
//правильный порядок команд 8-5-10-7
|
||||
var printer = factory.Create("Test");
|
||||
|
||||
@@ -6,6 +6,7 @@ public interface IContextRepository : IInjectableModule
|
||||
void ClearObject(int id);
|
||||
object GetObject(int id);
|
||||
T? GetObject<T>(int id);
|
||||
T GetSingleObject<T>();
|
||||
object GetSingleObject(Type type);
|
||||
int GetObjectIndex(object o);
|
||||
}
|
||||
@@ -21,13 +21,13 @@ public interface ISerialisationModule : IInjectableModule
|
||||
public interface IRepresentationModule : IInjectableModule
|
||||
{
|
||||
int Id { get; }
|
||||
Task<T> GetMessageAsync<T>(Guid? requestId = null, MessageType? messageType = null, CancellationToken token = default);
|
||||
T GetMessage<T>(Guid? requestId = null, MessageType? messageType = null);
|
||||
Task<T> GetMessageAsync<T>(Guid? requestId = null, EMessageType? messageType = null, CancellationToken token = default);
|
||||
T GetMessage<T>(Guid? requestId = null, EMessageType? messageType = null);
|
||||
T GetMessage<T>(Predicate<NetworkMessage> filter);
|
||||
Task<byte[]> GetRawMessage(Predicate<NetworkMessage> filter, CancellationToken token = default);
|
||||
|
||||
Task PostCallMessageAsync<T>(Guid id, MessageType messageType, T payload) where T : notnull;
|
||||
Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType);
|
||||
void PostCallMessage<T>(Guid id, MessageType messageType, T payload) where T : notnull;
|
||||
void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType);
|
||||
Task PostCallMessageAsync<T>(Guid id, EMessageType eMessageType, T payload) where T : notnull;
|
||||
Task PostCallMessageAsync(Guid id, EMessageType eMessageType, object payload, Type payloadType);
|
||||
void PostCallMessage<T>(Guid id, EMessageType eMessageType, T payload) where T : notnull;
|
||||
void PostCallMessage(Guid id, EMessageType eMessageType, object payload, Type payloadType);
|
||||
}
|
||||
@@ -28,6 +28,7 @@ public class BasicExecutionModule : IExecuteModule
|
||||
var context = command.ObjectId != -1
|
||||
? contextRepository.GetObject(command.ObjectId)
|
||||
: contextRepository.GetSingleObject(currentCommand.DeclaringType!);
|
||||
|
||||
var parameter = command.Parameter;
|
||||
|
||||
if (currentCommand.ReturnType.BaseType == typeof(Task) &&
|
||||
|
||||
@@ -54,12 +54,21 @@ public class ContextRepository : IContextRepository
|
||||
|
||||
public T GetObject<T>(int id)
|
||||
{
|
||||
return id == -1 || _storage.Length <= id ? throw new NullReferenceException("Cannot find that object. It is null"): (T)_storage[id]!;
|
||||
return id == -1 || _storage.Length <= id
|
||||
? throw new NullReferenceException("Cannot find that object. It is null")
|
||||
: (T)_storage[id]!;
|
||||
}
|
||||
|
||||
public T GetSingleObject<T>()
|
||||
{
|
||||
var result = GetSingleObject(typeof(T));
|
||||
return (T)result;
|
||||
}
|
||||
|
||||
public object GetSingleObject(Type type)
|
||||
{
|
||||
return _singletons!.GetValueOrDefault(type.GetHashCode()) ?? throw new ArgumentException("Unregistered singleton type");
|
||||
return _singletons!.GetValueOrDefault(type.GetHashCode()) ??
|
||||
throw new ArgumentException("Unregistered singleton type");
|
||||
}
|
||||
|
||||
public int GetObjectIndex(object o)
|
||||
@@ -81,8 +90,8 @@ public class ContextRepository : IContextRepository
|
||||
_storage = nextStorage;
|
||||
return _storage.Length;
|
||||
}
|
||||
|
||||
public void Inject<T>(T dependency)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
@@ -39,6 +39,12 @@ public class MultiClientContextRepository(Func<int, IContextRepository> produceR
|
||||
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).GetObject<T>(id);
|
||||
}
|
||||
|
||||
public T GetSingleObject<T>()
|
||||
{
|
||||
var result = GetSingleObject(typeof(T));
|
||||
return (T)result;
|
||||
}
|
||||
|
||||
public object GetSingleObject(Type type)
|
||||
{
|
||||
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).GetSingleObject(type);
|
||||
|
||||
@@ -71,7 +71,7 @@ public class NetworkGatewayModule : IGatewayModule
|
||||
interaction.StartInfiniteReceiving();
|
||||
interaction.PostMessage(new NetworkMessage
|
||||
{
|
||||
Id = Guid.NewGuid(), SchemaId = MessageType.IdAssigning,
|
||||
Id = Guid.NewGuid(), MessageType = EMessageType.IdAssigning,
|
||||
Data = _serialization.Serialize(new IdAssingnment { Id = interaction.ConnectionId })
|
||||
});
|
||||
_hub.RegisterInteraction(interaction);
|
||||
|
||||
@@ -37,9 +37,9 @@ public class NetworkFrontendBridge(IPEndPoint ipEndPoint) : IFrontendBridge
|
||||
var handle = _interactionModule.CurrentReceivingHandle;
|
||||
handle.WaitOne();
|
||||
var welcomeMessage = _interactionModule.LastMessage;
|
||||
if (welcomeMessage.SchemaId != MessageType.IdAssigning)
|
||||
if (welcomeMessage.MessageType != EMessageType.IdAssigning)
|
||||
{
|
||||
throw new Exception($"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.SchemaId.ToString()}");
|
||||
throw new Exception($"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.MessageType.ToString()}");
|
||||
}
|
||||
_interactionModule.HandleMessage(welcomeMessage);
|
||||
TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(_serialization.Deserialize<IdAssingnment>(welcomeMessage.Data)!.Id);
|
||||
|
||||
@@ -61,7 +61,7 @@ public class RequestExtractor : IRequestExtractor
|
||||
{
|
||||
|
||||
var request =
|
||||
_representationModule!.GetMessage<DefaultCallRequest>(m => m.Id != lastCommandId && m.SchemaId == MessageType.CallRequest);
|
||||
_representationModule!.GetMessage<DefaultCallRequest>(m => m.Id != lastCommandId && m.MessageType == EMessageType.CallRequest);
|
||||
lastCommandId = request.Id;
|
||||
if (request.Parameter is not null)
|
||||
{
|
||||
@@ -74,8 +74,8 @@ public class RequestExtractor : IRequestExtractor
|
||||
var result = _executeModule.Execute(request, _contextRepository);
|
||||
|
||||
var resultType = result is FinalCommandExecution
|
||||
? MessageType.FinishedCommandExecution
|
||||
: MessageType.ExceptionCommandExecution;
|
||||
? EMessageType.FinishedCommandExecution
|
||||
: EMessageType.ExceptionCommandExecution;
|
||||
|
||||
_representationModule.PostCallMessage(request.Id, resultType, result, result.GetType());
|
||||
}
|
||||
|
||||
@@ -4,24 +4,20 @@
|
||||
|
||||
namespace mROA.Implementation;
|
||||
|
||||
public class NetworkMessage
|
||||
public sealed class NetworkMessage
|
||||
{
|
||||
public static readonly NetworkMessage Null = new() { SchemaId = MessageType.Unknown, Id = Guid.Empty, Data = [] };
|
||||
public static readonly NetworkMessage Null = new() { MessageType = EMessageType.Unknown, Id = Guid.Empty, Data = [] };
|
||||
public Guid Id { get; init; }
|
||||
|
||||
[JsonConverter(typeof(JsonStringEnumConverter))]
|
||||
public MessageType SchemaId { get; init; }
|
||||
|
||||
public EMessageType MessageType { get; init; }
|
||||
public required byte[] Data { get; init; }
|
||||
|
||||
public bool IsValidMessage(Guid? requestId = null, MessageType? messageType = null)
|
||||
public bool IsValidMessage(Guid? requestId = null, EMessageType? messageType = null)
|
||||
{
|
||||
return (requestId is null || Id == requestId) &&
|
||||
(messageType is null || SchemaId == messageType);
|
||||
(messageType is null || MessageType == messageType);
|
||||
}
|
||||
}
|
||||
|
||||
public enum MessageType
|
||||
public enum EMessageType
|
||||
{
|
||||
Unknown,
|
||||
FinishedCommandExecution,
|
||||
|
||||
@@ -31,6 +31,11 @@ public class RemoteContextRepository : IContextRepository
|
||||
var remote = (T)Activator.CreateInstance(remoteType, id, _representationProducer.Produce(TransmissionConfig.OwnershipRepository.GetOwnershipId()))!;
|
||||
return remote;
|
||||
}
|
||||
public T GetSingleObject<T>()
|
||||
{
|
||||
var obj = GetSingleObject(typeof(T));
|
||||
return (T)obj;
|
||||
}
|
||||
|
||||
public object GetSingleObject(Type type)
|
||||
{
|
||||
|
||||
@@ -14,21 +14,20 @@ public abstract class RemoteObjectBase(int id, IRepresentationModule representat
|
||||
{
|
||||
var request = new DefaultCallRequest
|
||||
{ CommandId = methodId, ObjectId = id, Parameter = parameter, ParameterType = parameter?.GetType() };
|
||||
await representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request);
|
||||
await representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request);
|
||||
|
||||
var localTokenSource = new CancellationTokenSource();
|
||||
|
||||
var successResponse =
|
||||
representationModule.GetMessageAsync<FinalCommandExecution<T>>(
|
||||
messageType: MessageType.FinishedCommandExecution, requestId: request.Id, token: localTokenSource.Token);
|
||||
representationModule.GetMessageAsync<FinalCommandExecution<T>>(request.Id,
|
||||
EMessageType.FinishedCommandExecution, localTokenSource.Token);
|
||||
|
||||
var errorResponse =
|
||||
representationModule.GetMessageAsync<ExceptionCommandExecution>(
|
||||
messageType: MessageType.ExceptionCommandExecution, requestId: request.Id, token: localTokenSource.Token);
|
||||
representationModule.GetMessageAsync<ExceptionCommandExecution>(request.Id,
|
||||
EMessageType.ExceptionCommandExecution, localTokenSource.Token);
|
||||
|
||||
Task.WaitAny(successResponse, errorResponse);
|
||||
|
||||
|
||||
|
||||
if (successResponse.IsCompletedSuccessfully)
|
||||
{
|
||||
await localTokenSource.CancelAsync();
|
||||
@@ -43,14 +42,14 @@ public abstract class RemoteObjectBase(int id, IRepresentationModule representat
|
||||
{
|
||||
var request = new DefaultCallRequest
|
||||
{ CommandId = methodId, ObjectId = id, Parameter = parameter, ParameterType = parameter?.GetType() };
|
||||
await representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request);
|
||||
await representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request);
|
||||
|
||||
var successResponse =
|
||||
representationModule.GetMessageAsync<FinalCommandExecution>(
|
||||
messageType: MessageType.FinishedCommandExecution, requestId: request.Id);
|
||||
messageType: EMessageType.FinishedCommandExecution, requestId: request.Id);
|
||||
var errorResponse =
|
||||
representationModule.GetMessageAsync<ExceptionCommandExecution>(
|
||||
messageType: MessageType.ExceptionCommandExecution, requestId: request.Id);
|
||||
messageType: EMessageType.ExceptionCommandExecution, requestId: request.Id);
|
||||
|
||||
Task.WaitAny(successResponse, errorResponse);
|
||||
|
||||
|
||||
@@ -22,16 +22,17 @@ public class RepresentationModule : IRepresentationModule
|
||||
|
||||
public int Id => (_interaction ?? throw new NullReferenceException("Interaction is not initialized")).ConnectionId;
|
||||
|
||||
public async Task<T> GetMessageAsync<T>(Guid? requestId, MessageType? messageType,
|
||||
public async Task<T> GetMessageAsync<T>(Guid? requestId, EMessageType? messageType,
|
||||
CancellationToken token = default)
|
||||
{
|
||||
if (_serialization == null)
|
||||
throw new NullReferenceException("Serialization toolkit is not initialized");
|
||||
|
||||
return _serialization.Deserialize<T>(await GetRawMessage(m => m.IsValidMessage(requestId, messageType), token))!;
|
||||
var raw = await GetRawMessage(m => m.IsValidMessage(requestId, messageType), token);
|
||||
return _serialization.Deserialize<T>(raw)!;
|
||||
}
|
||||
|
||||
public T GetMessage<T>(Guid? requestId = null, MessageType? messageType = null)
|
||||
public T GetMessage<T>(Guid? requestId = null, EMessageType? messageType = null)
|
||||
{
|
||||
return GetMessage<T>(m => m.IsValidMessage(requestId, messageType));
|
||||
}
|
||||
@@ -40,8 +41,8 @@ public class RepresentationModule : IRepresentationModule
|
||||
{
|
||||
if (_serialization == null)
|
||||
throw new NullReferenceException("Serialization toolkit is not initialized");
|
||||
|
||||
return _serialization.Deserialize<T>(GetRawMessage(filter).GetAwaiter().GetResult())!;
|
||||
var raw = GetRawMessage(filter).GetAwaiter().GetResult();
|
||||
return _serialization.Deserialize<T>(raw)!;
|
||||
}
|
||||
|
||||
public async Task<byte[]> GetRawMessage(Predicate<NetworkMessage> filter, CancellationToken token = default)
|
||||
@@ -51,9 +52,6 @@ public class RepresentationModule : IRepresentationModule
|
||||
if (_interaction == null)
|
||||
throw new NullReferenceException("Interaction toolkit is not initialized");
|
||||
|
||||
// Console.WriteLine(
|
||||
// $"{DateTime.Now.TimeOfDay} {Environment.CurrentManagedThreadId} Representation : Reading");
|
||||
|
||||
if (filter(_interaction.LastMessage))
|
||||
{
|
||||
_interaction.HandleMessage(_interaction.LastMessage);
|
||||
@@ -71,20 +69,16 @@ public class RepresentationModule : IRepresentationModule
|
||||
|
||||
while (!token.IsCancellationRequested)
|
||||
{
|
||||
// Console.WriteLine(
|
||||
// $"{DateTime.Now.TimeOfDay} {Environment.CurrentManagedThreadId} Representation : Receiving message...");
|
||||
var handle = _interaction.CurrentReceivingHandle;
|
||||
handle.WaitOne();
|
||||
|
||||
message = _interaction.LastMessage;
|
||||
|
||||
// Console.WriteLine(
|
||||
// $"{DateTime.Now.TimeOfDay} {Environment.CurrentManagedThreadId} Representation : Message received {message.SchemaId} - {message.Id}");
|
||||
if (!filter(message)) continue;
|
||||
if (!filter(message))
|
||||
continue;
|
||||
|
||||
message = _interaction.LastMessage;
|
||||
// Console.WriteLine(
|
||||
// $"{DateTime.Now.TimeOfDay} {Environment.CurrentManagedThreadId} Representation : Message received Successfully {message.SchemaId} - {message.Id}");
|
||||
|
||||
_interaction.HandleMessage(message);
|
||||
return message.Data;
|
||||
}
|
||||
@@ -92,29 +86,30 @@ public class RepresentationModule : IRepresentationModule
|
||||
return [];
|
||||
}
|
||||
|
||||
public async Task PostCallMessageAsync<T>(Guid id, MessageType messageType, T payload) where T : notnull
|
||||
public async Task PostCallMessageAsync<T>(Guid id, EMessageType eMessageType, T payload) where T : notnull
|
||||
{
|
||||
await PostCallMessageAsync(id, messageType, payload, typeof(T));
|
||||
await PostCallMessageAsync(id, eMessageType, payload, typeof(T));
|
||||
}
|
||||
|
||||
public async Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType)
|
||||
public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, object payload, Type payloadType)
|
||||
{
|
||||
if (_interaction == null)
|
||||
throw new NullReferenceException("Interaction toolkit is not initialized");
|
||||
if (_serialization == null)
|
||||
throw new NullReferenceException("Serialization toolkit is not initialized");
|
||||
|
||||
await _interaction.PostMessage(new NetworkMessage
|
||||
{ Id = id, SchemaId = messageType, Data = _serialization.Serialize(payload, payloadType) });
|
||||
var message = new NetworkMessage
|
||||
{ Id = id, MessageType = eMessageType, Data = _serialization.Serialize(payload, payloadType) };
|
||||
await _interaction.PostMessage(message);
|
||||
}
|
||||
|
||||
public void PostCallMessage<T>(Guid id, MessageType messageType, T payload) where T : notnull
|
||||
public void PostCallMessage<T>(Guid id, EMessageType eMessageType, T payload) where T : notnull
|
||||
{
|
||||
PostCallMessageAsync(id, messageType, payload).GetAwaiter().GetResult();
|
||||
PostCallMessageAsync(id, eMessageType, payload).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
public void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType)
|
||||
public void PostCallMessage(Guid id, EMessageType eMessageType, object payload, Type payloadType)
|
||||
{
|
||||
PostCallMessageAsync(id, messageType, payload, payloadType).GetAwaiter().GetResult();
|
||||
PostCallMessageAsync(id, eMessageType, payload, payloadType).GetAwaiter().GetResult();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user