реализован производитель модулей сериализации
This commit is contained in:
@@ -5,6 +5,7 @@ using mROA.Codegen;
|
|||||||
using mROA.Implementation;
|
using mROA.Implementation;
|
||||||
using mROA.Implementation.Backend;
|
using mROA.Implementation.Backend;
|
||||||
using mROA.Implementation.Bootstrap;
|
using mROA.Implementation.Bootstrap;
|
||||||
|
using mROA.Implementation.Frontend;
|
||||||
|
|
||||||
|
|
||||||
var builder = new FullMixBuilder();
|
var builder = new FullMixBuilder();
|
||||||
@@ -14,7 +15,7 @@ builder.UseStreamInteraction();
|
|||||||
builder.UseBasicExecution();
|
builder.UseBasicExecution();
|
||||||
builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly);
|
builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly);
|
||||||
builder.SetupMethodsRepository(new CoCodegenMethodRepository());
|
builder.SetupMethodsRepository(new CoCodegenMethodRepository());
|
||||||
builder.Modules.Add(new StaticSerialisationModuleProducer());
|
builder.Modules.Add(new CreativeSerializationModuleProducer([], typeof(JsonFrontendSerialisationModule)));
|
||||||
|
|
||||||
builder.Build();
|
builder.Build();
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ public interface IInteractionModule : IInjectableModule
|
|||||||
{
|
{
|
||||||
void SendTo(int clientId, byte[] message);
|
void SendTo(int clientId, byte[] message);
|
||||||
void RegisterSource(Stream stream);
|
void RegisterSource(Stream stream);
|
||||||
|
Stream GetSource(int clientId);
|
||||||
public interface IFrontendInteractionModule : IInjectableModule
|
public interface IFrontendInteractionModule : IInjectableModule
|
||||||
{
|
{
|
||||||
int ClientId { get; }
|
int ClientId { get; }
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ public class StreamBasedInteractionModule : IInteractionModule
|
|||||||
_serialisationModule.SendWelcomeMessage(id);
|
_serialisationModule.SendWelcomeMessage(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream GetSource(int clientId)
|
||||||
|
{
|
||||||
|
return _streams.GetValueOrDefault(clientId, Stream.Null);
|
||||||
|
}
|
||||||
|
|
||||||
public void SendTo(int clientId, byte[] message)
|
public void SendTo(int clientId, byte[] message)
|
||||||
{
|
{
|
||||||
if (!_streams.TryGetValue(clientId, out var stream))
|
if (!_streams.TryGetValue(clientId, out var stream))
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using mROA.Abstract;
|
||||||
|
using mROA.Implementation.Backend;
|
||||||
|
using mROA.Implementation.Frontend;
|
||||||
|
|
||||||
|
namespace mROA.Implementation;
|
||||||
|
|
||||||
|
public class CreativeSerializationModuleProducer : ISerialisationModuleProducer
|
||||||
|
{
|
||||||
|
private Type _serializationModuleType;
|
||||||
|
private IInjectableModule[] _creationModules;
|
||||||
|
private StreamBasedInteractionModule? _interactionModule;
|
||||||
|
|
||||||
|
public CreativeSerializationModuleProducer(IInjectableModule[] creationModules, Type serializationModuleType)
|
||||||
|
{
|
||||||
|
_creationModules = creationModules;
|
||||||
|
_serializationModuleType = serializationModuleType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void Inject<T>(T dependency)
|
||||||
|
{
|
||||||
|
if (dependency is StreamBasedInteractionModule interactionModule)
|
||||||
|
_interactionModule = interactionModule;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISerialisationModule.IFrontendSerialisationModule Produce(int ownership)
|
||||||
|
{
|
||||||
|
if (_interactionModule == null)
|
||||||
|
throw new NullReferenceException("Interaction module is null");
|
||||||
|
|
||||||
|
var produced =
|
||||||
|
Activator.CreateInstance(_serializationModuleType) as ISerialisationModule.IFrontendSerialisationModule ??
|
||||||
|
throw new Exception("Bad serialization module type");
|
||||||
|
|
||||||
|
foreach (var creationModule in _creationModules)
|
||||||
|
produced.Inject(creationModule);
|
||||||
|
|
||||||
|
var interactionModule = new StreamBasedFrontendInteractionModule
|
||||||
|
{
|
||||||
|
ClientId = ownership,
|
||||||
|
ServerStream = _interactionModule.GetSource(ownership)
|
||||||
|
};
|
||||||
|
produced.Inject(interactionModule);
|
||||||
|
return produced;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Text;
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using mROA.Abstract;
|
using mROA.Abstract;
|
||||||
|
|
||||||
@@ -8,7 +7,6 @@ public class JsonFrontendSerialisationModule
|
|||||||
: ISerialisationModule.IFrontendSerialisationModule
|
: ISerialisationModule.IFrontendSerialisationModule
|
||||||
{
|
{
|
||||||
private IInteractionModule.IFrontendInteractionModule? _interactionModule;
|
private IInteractionModule.IFrontendInteractionModule? _interactionModule;
|
||||||
|
|
||||||
public int ClientId => _interactionModule!.ClientId;
|
public int ClientId => _interactionModule!.ClientId;
|
||||||
|
|
||||||
public async Task<T> GetNextCommandExecution<T>(Guid requestId) where T : ICommandExecution
|
public async Task<T> GetNextCommandExecution<T>(Guid requestId) where T : ICommandExecution
|
||||||
@@ -62,8 +60,9 @@ public class JsonFrontendSerialisationModule
|
|||||||
Data = post,
|
Data = post,
|
||||||
SchemaId = MessageType.CallRequest
|
SchemaId = MessageType.CallRequest
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Inject<T>(T dependency)
|
public void Inject<T>(T dependency)
|
||||||
{
|
{
|
||||||
if (dependency is IInteractionModule.IFrontendInteractionModule interactionModule)
|
if (dependency is IInteractionModule.IFrontendInteractionModule interactionModule)
|
||||||
|
|||||||
Reference in New Issue
Block a user