diff --git a/Example.Backend/Example.Backend.csproj b/Example.Backend/Example.Backend.csproj index 95845de..2306674 100644 --- a/Example.Backend/Example.Backend.csproj +++ b/Example.Backend/Example.Backend.csproj @@ -22,4 +22,8 @@ + + + + diff --git a/Example.Backend/Program.cs b/Example.Backend/Program.cs index 52016a0..b24e1ff 100644 --- a/Example.Backend/Program.cs +++ b/Example.Backend/Program.cs @@ -8,53 +8,61 @@ using mROA.Cbor; using mROA.Codegen; using mROA.Implementation; using mROA.Implementation.Backend; -using mROA.Implementation.Bootstrap; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; class Program { public static void Main(string[] args) { - var builder = new FullMixBuilder(); - // builder.UseJsonSerialisation(); - builder.Modules.Add(new CborSerializationToolkit()); - builder.Modules.Add(new BackendIdentityGenerator()); - // builder.UseNetworkGateway(new IPEndPoint(IPAddress.Loopback, 4567), typeof(NextGenerationInteractionModule), - // builder.GetModule()!); + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddOptions(); var listening = new IPEndPoint(IPAddress.Any, 4567); - builder.UseNetworkGateway(listening, typeof(ChannelInteractionModule), - builder.GetModule()!); - builder.Modules.Add(new UdpGateway(listening)); - builder.Modules.Add(new ConnectionHub()); - builder.Modules.Add(new HubRequestExtractor()); - builder.UseBasicExecution(); - builder.Modules.Add(new CreativeRepresentationModuleProducer( - new IInjectableModule[] { builder.GetModule()! }, - typeof(RepresentationModule))); - builder.Modules.Add(new RemoteInstanceRepository()); -// builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly); - builder.Modules.Add(new MultiClientInstanceRepository(i => + builder.Services.Configure(options => options.Endpoint = listening); + + builder.Services.AddSingleton(); + + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(provider => new MultiClientInstanceRepository(i => { - var repo = new InstanceRepository(); + var producer = provider.GetService(); + var repo = new InstanceRepository(producer); repo.FillSingletons(typeof(PrinterFactory).Assembly); - repo.Inject(builder.Modules.OfType().First()); + return repo; })); - var methodRepo = new CollectableMethodRepository(); - methodRepo.AppendInvokers(new GeneratedInvokersCollection()); - builder.Modules.Add(methodRepo); - builder.Modules.Add(new GeneratedCallIndexProvider()); - builder.Modules.Add(new GeneratedCallIndexProvider()); - builder.Modules.Add(new CancellationRepository()); - builder.Build(); - new RemoteTypeBinder(); + builder.Services.AddSingleton(p => + { + var methodRepo = new CollectableMethodRepository(); + methodRepo.AppendInvokers(new GeneratedInvokersCollection()); + return methodRepo; + }); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + + var mroaMachine = builder.Build(); + + mroaMachine.StartAsync(); +// +// builder.Build(); +// new RemoteTypeBinder(); +// +// + _ = mroaMachine.Services.GetService()!.Start(); + var gateway = mroaMachine.Services.GetService(); + gateway.Run(); + + Console.ReadLine(); - _ = builder.GetModule()!.Start(); - var gateway = builder.GetModule(); - gateway.Run(); - - Console.ReadLine(); } } \ No newline at end of file diff --git a/Example.Frontend/Example.Frontend.csproj b/Example.Frontend/Example.Frontend.csproj index fdac1b1..9deed54 100644 --- a/Example.Frontend/Example.Frontend.csproj +++ b/Example.Frontend/Example.Frontend.csproj @@ -21,4 +21,8 @@ + + + + diff --git a/Example.Load/Example.Load.csproj b/Example.Load/Example.Load.csproj index affee32..71a5437 100644 --- a/Example.Load/Example.Load.csproj +++ b/Example.Load/Example.Load.csproj @@ -13,4 +13,8 @@ + + + + diff --git a/Example.Shared/Example.Shared.csproj b/Example.Shared/Example.Shared.csproj index f727333..2cb81ef 100644 --- a/Example.Shared/Example.Shared.csproj +++ b/Example.Shared/Example.Shared.csproj @@ -14,6 +14,7 @@ + diff --git a/mROA.Cbor/IOrdinaryStructureParser.cs b/mROA.Cbor/IOrdinaryStructureParser.cs index 56c1c4a..8faa205 100644 --- a/mROA.Cbor/IOrdinaryStructureParser.cs +++ b/mROA.Cbor/IOrdinaryStructureParser.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Formats.Cbor; using mROA.Abstract; using mROA.Implementation; diff --git a/mROA/Abstract/ICallIndexProvider.cs b/mROA/Abstract/ICallIndexProvider.cs index 7dc2b7d..3169e68 100644 --- a/mROA/Abstract/ICallIndexProvider.cs +++ b/mROA/Abstract/ICallIndexProvider.cs @@ -5,7 +5,7 @@ using mROA.Implementation; namespace mROA.Abstract { - public interface ICallIndexProvider : IInjectableModule + public interface ICallIndexProvider { Dictionary> Activators { diff --git a/mROA/Abstract/ICancellationRepository.cs b/mROA/Abstract/ICancellationRepository.cs index 489a648..22189cb 100644 --- a/mROA/Abstract/ICancellationRepository.cs +++ b/mROA/Abstract/ICancellationRepository.cs @@ -3,7 +3,7 @@ using System.Threading; namespace mROA.Abstract { - public interface ICancellationRepository : IInjectableModule + public interface ICancellationRepository { void RegisterCancellation(Guid id, CancellationTokenSource cts); CancellationTokenSource? GetCancellation(Guid id); diff --git a/mROA/Abstract/IChannelInteractionModule.cs b/mROA/Abstract/IChannelInteractionModule.cs index 9b56492..2358d3d 100644 --- a/mROA/Abstract/IChannelInteractionModule.cs +++ b/mROA/Abstract/IChannelInteractionModule.cs @@ -5,10 +5,10 @@ using mROA.Implementation; namespace mROA.Abstract { - public interface IChannelInteractionModule : IInjectableModule, IDisposable + public interface IChannelInteractionModule : IDisposable { int ConnectionId { get; set; } - IEndPointContext Context { get; } + IEndPointContext Context { get; set; } Channel ReceiveChanel { get; } ChannelReader TrustedPostChanel { get; } ChannelReader UntrustedPostChanel { get; } diff --git a/mROA/Abstract/IConnectionHub.cs b/mROA/Abstract/IConnectionHub.cs index 01f60b9..2b5e6c6 100644 --- a/mROA/Abstract/IConnectionHub.cs +++ b/mROA/Abstract/IConnectionHub.cs @@ -4,7 +4,7 @@ public delegate void DisconnectionHandler(IRepresentationModule representationModule); - public interface IConnectionHub : IInjectableModule + public interface IConnectionHub { void RegisterInteraction(IChannelInteractionModule interaction); IChannelInteractionModule GetInteraction(int id); diff --git a/mROA/Abstract/IContextualSerializationToolKit.cs b/mROA/Abstract/IContextualSerializationToolKit.cs index ca6f5a0..906657b 100644 --- a/mROA/Abstract/IContextualSerializationToolKit.cs +++ b/mROA/Abstract/IContextualSerializationToolKit.cs @@ -2,7 +2,7 @@ namespace mROA.Abstract { - public interface IContextualSerializationToolKit : IInjectableModule + public interface IContextualSerializationToolKit { byte[] Serialize(object objectToSerialize, IEndPointContext? context); int Serialize(object objectToSerialize, Span destination, IEndPointContext? context); diff --git a/mROA/Abstract/IEndPointContext.cs b/mROA/Abstract/IEndPointContext.cs index 2e885f6..f7aa076 100644 --- a/mROA/Abstract/IEndPointContext.cs +++ b/mROA/Abstract/IEndPointContext.cs @@ -1,6 +1,6 @@ namespace mROA.Abstract { - public interface IEndPointContext : IInjectableModule + public interface IEndPointContext { IInstanceRepository RealRepository { get; set; } IInstanceRepository RemoteRepository { get; set; } diff --git a/mROA/Abstract/IExecuteModule.cs b/mROA/Abstract/IExecuteModule.cs index ea87f0d..c45a378 100644 --- a/mROA/Abstract/IExecuteModule.cs +++ b/mROA/Abstract/IExecuteModule.cs @@ -2,7 +2,7 @@ using mROA.Implementation; namespace mROA.Abstract { - public interface IExecuteModule : IInjectableModule + public interface IExecuteModule { ICommandExecution Execute(ICallRequest command, IInstanceRepository instanceRepository, IRepresentationModule representationModule, IEndPointContext context); diff --git a/mROA/Abstract/IFrontendBridge.cs b/mROA/Abstract/IFrontendBridge.cs index 7ce7460..8c0969e 100644 --- a/mROA/Abstract/IFrontendBridge.cs +++ b/mROA/Abstract/IFrontendBridge.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; namespace mROA.Abstract { - public interface IFrontendBridge : IInjectableModule, IDisposable + public interface IFrontendBridge : IDisposable { Task Connect(); void Obstacle(); diff --git a/mROA/Abstract/IGatewayModule.cs b/mROA/Abstract/IGatewayModule.cs index 77c869f..cfa25d1 100644 --- a/mROA/Abstract/IGatewayModule.cs +++ b/mROA/Abstract/IGatewayModule.cs @@ -2,7 +2,7 @@ using System; namespace mROA.Abstract { - public interface IGatewayModule : IDisposable, IInjectableModule + public interface IGatewayModule : IDisposable { void Run(); } diff --git a/mROA/Abstract/IIdentityGenerator.cs b/mROA/Abstract/IIdentityGenerator.cs index 6123cdd..34fd1cb 100644 --- a/mROA/Abstract/IIdentityGenerator.cs +++ b/mROA/Abstract/IIdentityGenerator.cs @@ -1,6 +1,6 @@ namespace mROA.Abstract { - public interface IIdentityGenerator : IInjectableModule + public interface IIdentityGenerator { int GetNextIdentity(); } diff --git a/mROA/Abstract/IInjectableModule.cs b/mROA/Abstract/IInjectableModule.cs deleted file mode 100644 index 055a1a2..0000000 --- a/mROA/Abstract/IInjectableModule.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace mROA.Abstract -{ - public interface IInjectableModule - { - void Inject(object dependency); - } -} \ No newline at end of file diff --git a/mROA/Abstract/IInstanceRepository.cs b/mROA/Abstract/IInstanceRepository.cs index 7c48159..a93570c 100644 --- a/mROA/Abstract/IInstanceRepository.cs +++ b/mROA/Abstract/IInstanceRepository.cs @@ -3,7 +3,7 @@ using mROA.Implementation; namespace mROA.Abstract { - public interface IInstanceRepository : IInjectableModule + public interface IInstanceRepository { int ResisterObject(object o, IEndPointContext context); void ClearObject(ComplexObjectIdentifier id, IEndPointContext context); diff --git a/mROA/Abstract/IMethodRepository.cs b/mROA/Abstract/IMethodRepository.cs index 4c468f1..327a8b1 100644 --- a/mROA/Abstract/IMethodRepository.cs +++ b/mROA/Abstract/IMethodRepository.cs @@ -1,6 +1,6 @@ namespace mROA.Abstract { - public interface IMethodRepository : IInjectableModule + public interface IMethodRepository { IMethodInvoker GetMethod(int id); } diff --git a/mROA/Abstract/IRealStoreInstanceRepository.cs b/mROA/Abstract/IRealStoreInstanceRepository.cs new file mode 100644 index 0000000..b740cfa --- /dev/null +++ b/mROA/Abstract/IRealStoreInstanceRepository.cs @@ -0,0 +1,7 @@ +namespace mROA.Abstract +{ + public interface IRealStoreInstanceRepository : IInstanceRepository + { + + } +} \ No newline at end of file diff --git a/mROA/Abstract/IRemoteObjectFactory.cs b/mROA/Abstract/IRemoteObjectFactory.cs index 1ae127f..ac17640 100644 --- a/mROA/Abstract/IRemoteObjectFactory.cs +++ b/mROA/Abstract/IRemoteObjectFactory.cs @@ -2,7 +2,7 @@ using mROA.Implementation; namespace mROA.Abstract { - public interface IRemoteObjectFactory : IInjectableModule + public interface IRemoteObjectFactory { T Produce(ComplexObjectIdentifier id, IEndPointContext context); } diff --git a/mROA/Abstract/IRepresentationModule.cs b/mROA/Abstract/IRepresentationModule.cs index de90b69..7fd4bf5 100644 --- a/mROA/Abstract/IRepresentationModule.cs +++ b/mROA/Abstract/IRepresentationModule.cs @@ -6,7 +6,7 @@ using mROA.Implementation; namespace mROA.Abstract { - public interface IRepresentationModule : IInjectableModule + public interface IRepresentationModule { int Id { get; } IEndPointContext Context { get; } diff --git a/mROA/Abstract/IRepresentationModuleProducer.cs b/mROA/Abstract/IRepresentationModuleProducer.cs index 6406c78..677f442 100644 --- a/mROA/Abstract/IRepresentationModuleProducer.cs +++ b/mROA/Abstract/IRepresentationModuleProducer.cs @@ -1,6 +1,6 @@ namespace mROA.Abstract { - public interface IRepresentationModuleProducer : IInjectableModule + public interface IRepresentationModuleProducer { IRepresentationModule Produce(int id); } diff --git a/mROA/Abstract/IRequestExtractor.cs b/mROA/Abstract/IRequestExtractor.cs index d49194b..f64e8a7 100644 --- a/mROA/Abstract/IRequestExtractor.cs +++ b/mROA/Abstract/IRequestExtractor.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; namespace mROA.Abstract { - public interface IRequestExtractor : IInjectableModule + public interface IRequestExtractor { Task StartExtraction(); } diff --git a/mROA/Abstract/IUntrustedGateway.cs b/mROA/Abstract/IUntrustedGateway.cs index 1c6f25c..d31bafc 100644 --- a/mROA/Abstract/IUntrustedGateway.cs +++ b/mROA/Abstract/IUntrustedGateway.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; namespace mROA.Abstract { - public interface IUntrustedGateway : IInjectableModule, IDisposable + public interface IUntrustedGateway : IDisposable { Task Start(); } diff --git a/mROA/Abstract/IUntrustedInteractionModule.cs b/mROA/Abstract/IUntrustedInteractionModule.cs index 151902b..3b12c3a 100644 --- a/mROA/Abstract/IUntrustedInteractionModule.cs +++ b/mROA/Abstract/IUntrustedInteractionModule.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; namespace mROA.Abstract { - public interface IUntrustedInteractionModule : IInjectableModule, IDisposable + public interface IUntrustedInteractionModule : IDisposable { Task Start(IPEndPoint endpoint); } diff --git a/mROA/Implementation/Backend/BackendIdentityGenerator.cs b/mROA/Implementation/Backend/BackendIdentityGenerator.cs index 5fe3fff..27ac4f0 100644 --- a/mROA/Implementation/Backend/BackendIdentityGenerator.cs +++ b/mROA/Implementation/Backend/BackendIdentityGenerator.cs @@ -10,9 +10,5 @@ namespace mROA.Implementation.Backend { return -++_currentId; } - - public void Inject(object dependency) - { - } } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/BasicConfigurationExtensions.cs b/mROA/Implementation/Backend/BasicConfigurationExtensions.cs deleted file mode 100644 index a10bdd3..0000000 --- a/mROA/Implementation/Backend/BasicConfigurationExtensions.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Net; -using System.Reflection; -using mROA.Abstract; -using mROA.Implementation.Bootstrap; - -namespace mROA.Implementation.Backend -{ - public static class BasicConfigurationExtensions - { - public static void UseNetworkGateway(this FullMixBuilder builder, IPEndPoint endPoint, - Type interactionModuleType, params IInjectableModule[] injectableModules) - { - builder.Modules.Add(new NetworkGatewayModule(endPoint, interactionModuleType, injectableModules)); - } - - public static void UseBasicExecution(this FullMixBuilder builder) - { - builder.Modules.Add(new BasicExecutionModule()); - } - - public static void UseCollectableContextRepository(this FullMixBuilder builder, params Assembly[] assemblies) - { - var repo = new InstanceRepository(); - repo.FillSingletons(assemblies); - builder.Modules.Add(repo); - } - - public static void SetupMethodsRepository(this FullMixBuilder builder, IMethodRepository methodRepository) - { - builder.Modules.Add(methodRepository); - } - } -} \ No newline at end of file diff --git a/mROA/Implementation/Backend/BasicExecutionModule.cs b/mROA/Implementation/Backend/BasicExecutionModule.cs index 6e8bf65..31f2735 100644 --- a/mROA/Implementation/Backend/BasicExecutionModule.cs +++ b/mROA/Implementation/Backend/BasicExecutionModule.cs @@ -7,24 +7,15 @@ namespace mROA.Implementation.Backend { public class BasicExecutionModule : IExecuteModule { - private ICancellationRepository? _cancellationRepo; - private IMethodRepository? _methodRepo; - private IContextualSerializationToolKit? _serialization; + private readonly ICancellationRepository _cancellationRepo; + private readonly IMethodRepository _methodRepo; + private readonly IContextualSerializationToolKit _serialization; - public void Inject(object dependency) + public BasicExecutionModule(ICancellationRepository cancellationRepo, IMethodRepository methodRepo, IContextualSerializationToolKit serialization) { - switch (dependency) - { - case IMethodRepository methodRepo: - _methodRepo = methodRepo; - break; - case ICancellationRepository cancellationRepo: - _cancellationRepo = cancellationRepo; - break; - case IContextualSerializationToolKit serializationToolkit: - _serialization = serializationToolkit; - break; - } + _cancellationRepo = cancellationRepo; + _methodRepo = methodRepo; + _serialization = serialization; } public ICommandExecution Execute(ICallRequest command, IInstanceRepository instanceRepository, @@ -38,7 +29,7 @@ namespace mROA.Implementation.Backend return CancelExecution(command); } - var invoker = _methodRepo!.GetMethod(command.CommandId); + var invoker = _methodRepo.GetMethod(command.CommandId); if (invoker == null) throw new Exception($"Command {command.CommandId} not found"); @@ -60,10 +51,10 @@ namespace mROA.Implementation.Backend { case AsyncMethodInvoker { IsVoid: false } asyncNonVoidMethodInvoker: return TypedExecuteAsync(asyncNonVoidMethodInvoker, context, castedParams, command, - _cancellationRepo!, + _cancellationRepo, representationModule, execContext, endPointContext); case AsyncMethodInvoker asyncMethodInvoker: - return ExecuteAsync(asyncMethodInvoker, context, castedParams, command, _cancellationRepo!, + return ExecuteAsync(asyncMethodInvoker, context, castedParams, command, _cancellationRepo, representationModule, execContext, endPointContext); default: var result = Execute((invoker as MethodInvoker)!, context, castedParams!, command, execContext); @@ -99,7 +90,7 @@ namespace mROA.Implementation.Backend object?[] castedParams = new object[invoker.ParameterTypes.Length]; for (var i = 0; i < castedParams.Length; i++) { - castedParams[i] = _serialization!.Cast(command.Parameters![i], invoker.ParameterTypes[i], context); + castedParams[i] = _serialization.Cast(command.Parameters![i], invoker.ParameterTypes[i], context); } return castedParams; @@ -119,7 +110,7 @@ namespace mROA.Implementation.Backend private FinalCommandExecution CancelExecution(ICallRequest command) { - var cts = _cancellationRepo!.GetCancellation(command.Id); + var cts = _cancellationRepo.GetCancellation(command.Id); if (cts == null) throw new NullReferenceException("Can't find cancellation for this request"); cts.Cancel(); @@ -237,7 +228,7 @@ namespace mROA.Implementation.Backend Id = command.Id, Result = finalResult }; - _cancellationRepo!.FreeCancelation(command.Id); + _cancellationRepo.FreeCancelation(command.Id); representationModule.PostCallMessage(command.Id, EMessageType.FinishedCommandExecution, payload, context); diff --git a/mROA/Implementation/Backend/ConnectionHub.cs b/mROA/Implementation/Backend/ConnectionHub.cs index ed02c65..5034a28 100644 --- a/mROA/Implementation/Backend/ConnectionHub.cs +++ b/mROA/Implementation/Backend/ConnectionHub.cs @@ -7,7 +7,12 @@ namespace mROA.Implementation.Backend public class ConnectionHub : IConnectionHub { private readonly Dictionary _connections = new(); - private IContextualSerializationToolKit? _serializationToolkit; + private IContextualSerializationToolKit _serializationToolkit; + + public ConnectionHub(IContextualSerializationToolKit serializationToolkit) + { + _serializationToolkit = serializationToolkit; + } public void RegisterInteraction(IChannelInteractionModule interaction) { @@ -15,9 +20,7 @@ namespace mROA.Implementation.Backend throw new NullReferenceException("Serialization toolkit is null"); _connections.Add(interaction.ConnectionId, interaction); - var module = new RepresentationModule(); - module.Inject(_serializationToolkit); - module.Inject(interaction); + var module = new RepresentationModule(interaction, _serializationToolkit); OnConnected?.Invoke(module); } @@ -29,11 +32,5 @@ namespace mROA.Implementation.Backend public event ConnectionHandler? OnConnected; public event DisconnectionHandler? OnDisconnected; - - public void Inject(object dependency) - { - if (dependency is IContextualSerializationToolKit serializationToolkit) - _serializationToolkit = serializationToolkit; - } } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/HubRequestExtractor.cs b/mROA/Implementation/Backend/HubRequestExtractor.cs index 3358b29..3a47f5d 100644 --- a/mROA/Implementation/Backend/HubRequestExtractor.cs +++ b/mROA/Implementation/Backend/HubRequestExtractor.cs @@ -3,41 +3,28 @@ using mROA.Implementation.Frontend; namespace mROA.Implementation.Backend { - public class HubRequestExtractor : IInjectableModule + public class HubRequestExtractor { - private IConnectionHub? _hub; + private IConnectionHub _hub; - private IInstanceRepository? _contextRepository; - private IInstanceRepository? _remoteContextRepository; - private IMethodRepository? _methodRepository; - private IContextualSerializationToolKit? _serializationToolkit; - private IExecuteModule? _executeModule; + private IRealStoreInstanceRepository _contextRepository; + private IInstanceRepository _remoteContextRepository; + private IMethodRepository _methodRepository; + private IContextualSerializationToolKit _serializationToolkit; + private IExecuteModule _executeModule; - public void Inject(object dependency) + public HubRequestExtractor(IConnectionHub hub, IRealStoreInstanceRepository contextRepository, + RemoteInstanceRepository remoteContextRepository, IMethodRepository methodRepository, + IContextualSerializationToolKit serializationToolkit, IExecuteModule executeModule) { - switch (dependency) - { - case IConnectionHub connectionHub: - _hub = connectionHub; - _hub.OnConnected += HubOnOnConnected; - break; - case MultiClientInstanceRepository: - case InstanceRepository: - _contextRepository = dependency as IInstanceRepository; - break; - case RemoteInstanceRepository remoteContextRepository: - _remoteContextRepository = remoteContextRepository; - break; - case IMethodRepository methodRepository: - _methodRepository = methodRepository; - break; - case IContextualSerializationToolKit serializationToolkit: - _serializationToolkit = serializationToolkit; - break; - case IExecuteModule executeModule: - _executeModule = executeModule; - break; - } + _hub = hub; + _hub.OnConnected += HubOnOnConnected; + + _contextRepository = contextRepository; + _remoteContextRepository = remoteContextRepository; + _methodRepository = methodRepository; + _serializationToolkit = serializationToolkit; + _executeModule = executeModule; } private void HubOnOnConnected(IRepresentationModule interaction) @@ -54,20 +41,15 @@ namespace mROA.Implementation.Backend private IRequestExtractor CreateExtractor(IRepresentationModule interaction) { - var extractor = new RequestExtractor(); + var extractor = new RequestExtractor(_executeModule, _methodRepository, interaction, _serializationToolkit, interaction.Context); var context = interaction.Context; - extractor.Inject(interaction); if (_contextRepository is IContextRepositoryHub contextHub) context.RealRepository = contextHub.GetRepository(interaction.Id); else - context.RealRepository = _contextRepository!; + context.RealRepository = _contextRepository; - context.RemoteRepository = _remoteContextRepository!; - - extractor.Inject(context); - extractor.Inject(_methodRepository); - extractor.Inject(_serializationToolkit); - extractor.Inject(_executeModule); + context.RemoteRepository = _remoteContextRepository; + return extractor; } } diff --git a/mROA/Implementation/Backend/InstanceRepository.cs b/mROA/Implementation/Backend/InstanceRepository.cs index c12c71c..f61f7f5 100644 --- a/mROA/Implementation/Backend/InstanceRepository.cs +++ b/mROA/Implementation/Backend/InstanceRepository.cs @@ -7,17 +7,18 @@ using mROA.Implementation.Attributes; namespace mROA.Implementation.Backend { - public class InstanceRepository : IInstanceRepository + public class InstanceRepository : IRealStoreInstanceRepository { public static object[] EventBinders = { }; - private IRepresentationModuleProducer? _representationModuleProducer; + private IRepresentationModuleProducer _representationModuleProducer; private Dictionary _singletons = new(); private readonly IStorage _storage; - public InstanceRepository() + public InstanceRepository(IRepresentationModuleProducer representationModuleProducer) { + _representationModuleProducer = representationModuleProducer; _storage = new ExtensibleStorage(); } @@ -34,7 +35,7 @@ namespace mROA.Implementation.Backend var binders = EventBinders.Where(i => generic.Any(g => g.IsAssignableFrom(i.GetType()))); foreach (var binder in binders) - ((IEventBinder)binder).BindEvents(o, context, _representationModuleProducer!, last); + ((IEventBinder)binder).BindEvents(o, context, _representationModuleProducer, last); return last; } @@ -74,14 +75,6 @@ namespace mROA.Implementation.Backend return index == -1 ? ResisterObject(o, context) : index; } - public void Inject(object dependency) - { - if (dependency is IRepresentationModuleProducer moduleProducer) - { - _representationModuleProducer = moduleProducer; - } - } - public void FillSingletons(params Assembly[] assembly) { var types = assembly.SelectMany(x => x.GetTypes()).Where(type => diff --git a/mROA/Implementation/Backend/MultiClientInstanceRepository.cs b/mROA/Implementation/Backend/MultiClientInstanceRepository.cs index 97630ff..47e8c31 100644 --- a/mROA/Implementation/Backend/MultiClientInstanceRepository.cs +++ b/mROA/Implementation/Backend/MultiClientInstanceRepository.cs @@ -4,7 +4,7 @@ using mROA.Abstract; namespace mROA.Implementation.Backend { - public class MultiClientInstanceRepository : IInstanceRepository, IContextRepositoryHub + public class MultiClientInstanceRepository : IRealStoreInstanceRepository, IContextRepositoryHub { private readonly Func _produceRepository; private readonly Dictionary _repositories = new(); @@ -14,10 +14,6 @@ namespace mROA.Implementation.Backend _produceRepository = produceRepository; } - public void Inject(object dependency) - { - } - public int HostId { get; set; } public int ResisterObject(object o, IEndPointContext context) diff --git a/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs b/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs deleted file mode 100644 index 5bb5197..0000000 --- a/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using mROA.Abstract; - -namespace mROA.Implementation.Backend -{ - public class MultiClientOwnershipRepository : IOwnershipRepository - { - private Dictionary _ownerships = new(); - - public int GetOwnershipId() - { - return _ownerships.GetValueOrDefault(Environment.CurrentManagedThreadId, 0); - } - - public int GetHostOwnershipId() => 0; - - - public void RegisterOwnership(int ownershipId) - { - _ownerships.TryAdd(Environment.CurrentManagedThreadId, ownershipId); - } - - public void FreeOwnership() - { - _ownerships.Remove(Environment.CurrentManagedThreadId); - } - } -} \ No newline at end of file diff --git a/mROA/Implementation/Backend/NetworkGatewayModule.cs b/mROA/Implementation/Backend/NetworkGatewayModule.cs index 34a18b1..6cf40bd 100644 --- a/mROA/Implementation/Backend/NetworkGatewayModule.cs +++ b/mROA/Implementation/Backend/NetworkGatewayModule.cs @@ -4,26 +4,26 @@ using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Options; using mROA.Abstract; namespace mROA.Implementation.Backend { public class NetworkGatewayModule : IGatewayModule { - private readonly IInjectableModule[]? _injectableModules; - private readonly Type? _interactionModuleType; + private readonly IServiceProvider _serviceProvider; private readonly TcpListener _tcpListener; private IConnectionHub? _hub; - private IContextualSerializationToolKit? _serialization; - private Dictionary _extractorsCTS = new(); - private ICallIndexProvider _callIndexProvider; - - public NetworkGatewayModule(IPEndPoint endpoint, Type interactionModuleType, - IInjectableModule[] injectableModules) + private readonly IContextualSerializationToolKit _serialization; + private readonly Dictionary _extractorsCTS = new(); + private ICallIndexProvider? _callIndexProvider; + private readonly IIdentityGenerator _identityGenerator; + public NetworkGatewayModule(IOptions options, IServiceProvider service, IIdentityGenerator identityGenerator, IContextualSerializationToolKit serialization) { - _tcpListener = new(endpoint); - _interactionModuleType = interactionModuleType; - _injectableModules = injectableModules; + _tcpListener = new(options.Value.Endpoint); + _serviceProvider = service; + _identityGenerator = identityGenerator; + _serialization = serialization; } public void Run() @@ -40,40 +40,15 @@ namespace mROA.Implementation.Backend _tcpListener.Stop(); } - public void Inject(object dependency) - { - switch (dependency) - { - case IConnectionHub interactionModule: - _hub = interactionModule; - break; - case IContextualSerializationToolKit serializationToolkit: - _serialization = serializationToolkit; - break; - case ICallIndexProvider callIndexProvider: - _callIndexProvider = callIndexProvider; - break; - } - } - private async Task HandleIncomingConnections() { - ThrowIfNotInjected(); - while (true) { var client = await _tcpListener.AcceptTcpClientAsync(); Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}"); - var interaction = Activator.CreateInstance(_interactionModuleType!) as IChannelInteractionModule; - - foreach (var injectableModule in _injectableModules!) - interaction!.Inject(injectableModule); - - interaction!.Inject(_serialization); - - - //TODO сделать контекст - var context = new EndPointContext(); + var interaction = new ChannelInteractionModule(_serialization, _identityGenerator); + + var context = new EndPointContext(null, null); context.CallIndexProvider = _callIndexProvider; var streamExtractor = new ChannelInteractionModule.StreamExtractor(client.GetStream(), _serialization, context); @@ -91,7 +66,7 @@ namespace mROA.Implementation.Backend case EMessageType.ClientConnect: context.HostId = 0; context.OwnerId = -interaction.ConnectionId; - interaction.Inject(context); + interaction.Context = context; Task.Run(async () => await streamExtractor.LoopedReceive(cts.Token)); _ = streamExtractor.SendFromChannel(interaction.TrustedPostChanel, cts.Token); interaction.PostMessageAsync(new NetworkMessageHeader(_serialization!, @@ -126,19 +101,11 @@ namespace mROA.Implementation.Backend } } } + } - private void ThrowIfNotInjected() - { - if (_hub is null) - throw new NullReferenceException("Hub module is null"); - if (_tcpListener == null) - throw new NullReferenceException("TcpListener is null"); - if (_injectableModules is null) - throw new NullReferenceException("InjectableModules is null"); - if (_interactionModuleType is null) - throw new NullReferenceException("InteractionModuleType is null"); - if (_serialization is null) - throw new NullReferenceException("Serialization is null"); - } + public class GatewayOptions + { + public IPEndPoint Endpoint { get; set; } + public Type InteractionModuleType { get; set; } } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/UdpGateway.cs b/mROA/Implementation/Backend/UdpGateway.cs index fe3f8eb..ae02db8 100644 --- a/mROA/Implementation/Backend/UdpGateway.cs +++ b/mROA/Implementation/Backend/UdpGateway.cs @@ -18,28 +18,15 @@ namespace mROA.Implementation.Backend private IContextualSerializationToolKit _serializationToolkit; private IEndPointContext _context; - public UdpGateway(IPEndPoint listeningEndpoint) + public UdpGateway(IPEndPoint listeningEndpoint, IConnectionHub hub, IContextualSerializationToolKit serializationToolkit, IEndPointContext context) { + _hub = hub; + _serializationToolkit = serializationToolkit; + _context = context; _client = new UdpClient(listeningEndpoint); } - public void Inject(object dependency) - { - switch (dependency) - { - case IConnectionHub hub: - _hub = hub; - break; - case IContextualSerializationToolKit serializationToolkit: - _serializationToolkit = serializationToolkit; - break; - case IEndPointContext context: - _context = context; - break; - } - } - public void Dispose() { _tokenSource.Cancel(); diff --git a/mROA/Implementation/Bootstrap/FullMixBuilder.cs b/mROA/Implementation/Bootstrap/FullMixBuilder.cs deleted file mode 100644 index e018a7e..0000000 --- a/mROA/Implementation/Bootstrap/FullMixBuilder.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using mROA.Abstract; - -namespace mROA.Implementation.Bootstrap -{ - public class FullMixBuilder - { - public List Modules { get; } = new(); - - public void Build() - { - foreach (var module in Modules) - foreach (var injection in Modules) - module.Inject(injection); - } - - public T GetModule() - { - return Modules.OfType().FirstOrDefault(); - } - - public bool TryGetModule(out IInjectableModule module) where T : IInjectableModule - { - var mod = Modules.OfType().FirstOrDefault(); - if (mod is null) - { - module = default; - return false; - } - - module = mod; - return true; - } - } -} \ No newline at end of file diff --git a/mROA/Implementation/CancellationRepository.cs b/mROA/Implementation/CancellationRepository.cs index 82814b5..92db694 100644 --- a/mROA/Implementation/CancellationRepository.cs +++ b/mROA/Implementation/CancellationRepository.cs @@ -24,9 +24,5 @@ namespace mROA.Implementation { _cancellations.Remove(id, out _); } - - public void Inject(object dependency) - { - } } } \ No newline at end of file diff --git a/mROA/Implementation/ChannelInteractionModule.cs b/mROA/Implementation/ChannelInteractionModule.cs index cc6f57b..8a6b144 100644 --- a/mROA/Implementation/ChannelInteractionModule.cs +++ b/mROA/Implementation/ChannelInteractionModule.cs @@ -15,14 +15,17 @@ namespace mROA.Implementation private readonly ChannelWriter _untrustedWriter; private readonly Channel _outputTrustedChannel; private readonly Channel _outputUntrustedChannel; - private IContextualSerializationToolKit? _serialization; + private IContextualSerializationToolKit _serialization; private bool _isConnected = true; private bool _isActive = true; private TaskCompletionSource _reconnection; - private IEndPointContext? _context; - public ChannelInteractionModule() + public ChannelInteractionModule(IContextualSerializationToolKit serialization, + IIdentityGenerator identityGenerator) { + _serialization = serialization; + ConnectionId = identityGenerator.GetNextIdentity(); + ReceiveChanel = Channel.CreateUnbounded(new UnboundedChannelOptions { SingleReader = false, @@ -46,29 +49,13 @@ namespace mROA.Implementation public int ConnectionId { get; set; } - public IEndPointContext Context => _context; + public IEndPointContext Context { get; set; } public Channel ReceiveChanel { get; } public ChannelReader TrustedPostChanel => _outputTrustedChannel.Reader; public ChannelReader UntrustedPostChanel => _outputUntrustedChannel.Reader; public Func IsConnected { get; set; } = () => false; - public void Inject(object dependency) - { - switch (dependency) - { - case IContextualSerializationToolKit toolkit: - _serialization = toolkit; - break; - case IIdentityGenerator identityGenerator: - ConnectionId = identityGenerator.GetNextIdentity(); - break; - case IEndPointContext endpointContext: - _context = endpointContext; - break; - } - } - public ValueTask GetNextMessageReceiving(bool infinite = true) { return _receiveReader.ReadAsync(); @@ -122,7 +109,7 @@ namespace mROA.Implementation if (sendRecovery) { await PostMessageAsync( - new NetworkMessageHeader(_serialization!, new ClientRecovery(Math.Abs(ConnectionId)), _context)); + new NetworkMessageHeader(_serialization, new ClientRecovery(Math.Abs(ConnectionId)), Context)); await ReceiveChanel.Reader.ReadAsync(); } else diff --git a/mROA/Implementation/CollectableMethodRepository.cs b/mROA/Implementation/CollectableMethodRepository.cs index 525b7ac..8fb9d7e 100644 --- a/mROA/Implementation/CollectableMethodRepository.cs +++ b/mROA/Implementation/CollectableMethodRepository.cs @@ -7,10 +7,6 @@ namespace mROA.Implementation { private List _methods = new(); - public void Inject(object dependency) - { - } - public void AppendInvokers(IEnumerable methodInvokers) { _methods.AddRange(methodInvokers); diff --git a/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs b/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs index ddbc1f3..3199141 100644 --- a/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs +++ b/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs @@ -1,6 +1,5 @@ using System; using mROA.Abstract; -using mROA.Implementation.Bootstrap; using mROA.Implementation.Frontend; namespace mROA.Implementation.CommandExecution diff --git a/mROA/Implementation/CreativeRepresentationModuleProducer.cs b/mROA/Implementation/CreativeRepresentationModuleProducer.cs index 376029e..fb9bb2c 100644 --- a/mROA/Implementation/CreativeRepresentationModuleProducer.cs +++ b/mROA/Implementation/CreativeRepresentationModuleProducer.cs @@ -5,37 +5,25 @@ namespace mROA.Implementation { public class CreativeRepresentationModuleProducer : IRepresentationModuleProducer { - private Type _reprModuleType; - private IInjectableModule[] _creationModules; - private IConnectionHub? _hub; - - public CreativeRepresentationModuleProducer(IInjectableModule[] creationModules, Type reprModuleType) + private IServiceProvider _creationModules; + private IConnectionHub _hub; + private IContextualSerializationToolKit _serialization; + public CreativeRepresentationModuleProducer(IServiceProvider creationModules, IConnectionHub hub, IContextualSerializationToolKit serialization) { _creationModules = creationModules; - _reprModuleType = reprModuleType; + _hub = hub; + _serialization = serialization; } - public void Inject(object dependency) - { - if (dependency is IConnectionHub interactionModule) - _hub = interactionModule; - } - public IRepresentationModule Produce(int id) { if (_hub == null) throw new NullReferenceException("Interaction module is null"); - var produced = - Activator.CreateInstance(_reprModuleType) as IRepresentationModule ?? - throw new Exception("Bad serialization module type"); - - foreach (var creationModule in _creationModules) - produced.Inject(creationModule); - var interaction = _hub.GetInteraction(id); - produced.Inject(interaction); + + var produced = new RepresentationModule(interaction, _serialization); return produced; } diff --git a/mROA/Implementation/EndPointContext.cs b/mROA/Implementation/EndPointContext.cs index 39a2215..adda01e 100644 --- a/mROA/Implementation/EndPointContext.cs +++ b/mROA/Implementation/EndPointContext.cs @@ -1,10 +1,19 @@ using mROA.Abstract; -using mROA.Implementation.Backend; namespace mROA.Implementation { public class EndPointContext : IEndPointContext { + public EndPointContext() + { + + } + public EndPointContext(IInstanceRepository realRepository, IInstanceRepository remoteRepository) + { + RealRepository = realRepository; + RemoteRepository = remoteRepository; + } + public IInstanceRepository RealRepository { get; set; } public IInstanceRepository RemoteRepository { get; set; } public ICallIndexProvider CallIndexProvider { get; set; } @@ -12,19 +21,5 @@ namespace mROA.Implementation public int HostId { get; set; } public int OwnerId { get; set; } - - - public void Inject(object dependency) - { - switch (dependency) - { - case RemoteInstanceRepository remoteRepository: - RemoteRepository = remoteRepository; - break; - case InstanceRepository realRepository: - RealRepository = realRepository; - break; - } - } } } \ No newline at end of file diff --git a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs index 1927038..c9a4867 100644 --- a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs +++ b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs @@ -13,33 +13,19 @@ namespace mROA.Implementation.Frontend private readonly IPEndPoint _serverEndPoint; private TcpClient _tcpClient = new(); private IChannelInteractionModule? _interactionModule; - private IContextualSerializationToolKit? _serialization; - private ChannelInteractionModule.StreamExtractor _currentExtractor; + private IContextualSerializationToolKit _serialization; + private ChannelInteractionModule.StreamExtractor? _currentExtractor; private CancellationTokenSource _rawExtractorCancellation; private IEndPointContext _context; - public NetworkFrontendBridge(IPEndPoint serverEndPoint) + public NetworkFrontendBridge(IPEndPoint serverEndPoint, IEndPointContext context, IContextualSerializationToolKit serialization) { _serverEndPoint = serverEndPoint; + _context = context; + _serialization = serialization; _rawExtractorCancellation = new CancellationTokenSource(); } - public void Inject(object dependency) - { - switch (dependency) - { - case ChannelInteractionModule interactionModule: - _interactionModule = interactionModule; - break; - case IContextualSerializationToolKit toolkit: - _serialization = toolkit; - break; - case IEndPointContext endPointContext: - _context = endPointContext; - break; - } - } - public async Task Connect() { if (_interactionModule is null) @@ -77,7 +63,7 @@ namespace mROA.Implementation.Frontend private void PrepareExtractor() { _currentExtractor = - new ChannelInteractionModule.StreamExtractor(_tcpClient.GetStream(), _serialization!, _context); + new ChannelInteractionModule.StreamExtractor(_tcpClient.GetStream(), _serialization, _context); _ = _currentExtractor.SendFromChannel(_interactionModule!.TrustedPostChanel, _rawExtractorCancellation.Token); @@ -109,7 +95,7 @@ namespace mROA.Implementation.Frontend public void Disconnect() { - _ = _interactionModule!.PostMessageAsync(new NetworkMessageHeader(_serialization!, new ClientDisconnect(), + _ = _interactionModule!.PostMessageAsync(new NetworkMessageHeader(_serialization, new ClientDisconnect(), _context)); _interactionModule.Dispose(); _tcpClient.Dispose(); diff --git a/mROA/Implementation/Frontend/RequestExtractor.cs b/mROA/Implementation/Frontend/RequestExtractor.cs index 876fdee..eb240e0 100644 --- a/mROA/Implementation/Frontend/RequestExtractor.cs +++ b/mROA/Implementation/Frontend/RequestExtractor.cs @@ -9,34 +9,21 @@ namespace mROA.Implementation.Frontend { public class RequestExtractor : IRequestExtractor { - private IExecuteModule? _executeModule; + private IExecuteModule _executeModule; - private IMethodRepository? _methodRepository; + private IMethodRepository _methodRepository; - private IRepresentationModule? _representationModule; - private IContextualSerializationToolKit? _serializationToolkit; + private IRepresentationModule _representationModule; + private IContextualSerializationToolKit _serializationToolkit; private IEndPointContext _context; - public void Inject(object dependency) + public RequestExtractor(IExecuteModule executeModule, IMethodRepository methodRepository, IRepresentationModule representationModule, IContextualSerializationToolKit serializationToolkit, IEndPointContext context) { - switch (dependency) - { - case IExecuteModule executeModule: - _executeModule = executeModule; - break; - case IMethodRepository methodRepository: - _methodRepository = methodRepository; - break; - case IRepresentationModule representationModule: - _representationModule = representationModule; - break; - case IContextualSerializationToolKit serializationToolkit: - _serializationToolkit = serializationToolkit; - break; - case IEndPointContext remoteContext: - _context = remoteContext; - break; - } + _executeModule = executeModule; + _methodRepository = methodRepository; + _representationModule = representationModule; + _serializationToolkit = serializationToolkit; + _context = context; } public async Task StartExtraction() @@ -45,7 +32,7 @@ namespace mROA.Implementation.Frontend var streamTokenSource = new CancellationTokenSource(); - var query = _representationModule!.GetStream(m => + var query = _representationModule.GetStream(m => m.MessageType is EMessageType.CallRequest or EMessageType.CancelRequest or EMessageType.EventRequest or EMessageType.ClientDisconnect, _context, streamTokenSource.Token, @@ -90,12 +77,12 @@ namespace mROA.Implementation.Frontend private void HandleCancelRequest(CancelRequest req) { - _executeModule!.Execute(req, _context.RealRepository, _representationModule!, _context); + _executeModule.Execute(req, _context.RealRepository, _representationModule, _context); } private void HandleCallRequest(DefaultCallRequest request) { - var result = _executeModule!.Execute(request, _context.RealRepository, _representationModule!, _context); + var result = _executeModule.Execute(request, _context.RealRepository, _representationModule, _context); var resultType = result.MessageType; @@ -104,12 +91,12 @@ namespace mROA.Implementation.Frontend return; } - _representationModule!.PostCallMessage(request.Id, resultType, result, _context); + _representationModule.PostCallMessage(request.Id, resultType, result, _context); } private void HandleEventRequest(DefaultCallRequest request) { - _executeModule!.Execute(request, _context.RemoteRepository, _representationModule!, _context); + _executeModule.Execute(request, _context.RemoteRepository, _representationModule, _context); } } } \ No newline at end of file diff --git a/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs b/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs index 4e40dea..183be31 100644 --- a/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs +++ b/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs @@ -9,10 +9,17 @@ namespace mROA.Implementation.Frontend { public class UdpUntrustedInteraction : IUntrustedInteractionModule { - private IContextualSerializationToolKit _serializationToolkit; - private IChannelInteractionModule _channelInteractionModule; - private CancellationTokenSource _tokenSource = new(); - private IEndPointContext _context; + private readonly IContextualSerializationToolKit _serializationToolkit; + private readonly IChannelInteractionModule _channelInteractionModule; + private readonly CancellationTokenSource _tokenSource = new(); + private readonly IEndPointContext _context; + + public UdpUntrustedInteraction(IContextualSerializationToolKit serializationToolkit, IChannelInteractionModule channelInteractionModule, IEndPointContext context) + { + _serializationToolkit = serializationToolkit; + _channelInteractionModule = channelInteractionModule; + _context = context; + } public void Dispose() { @@ -65,21 +72,5 @@ namespace mROA.Implementation.Frontend await udpClient.SendAsync(serialized, serialized.Length); } } - - public void Inject(object dependency) - { - switch (dependency) - { - case IChannelInteractionModule channelModule: - _channelInteractionModule = channelModule; - break; - case IContextualSerializationToolKit serializationToolkit: - _serializationToolkit = serializationToolkit; - break; - case IEndPointContext endPointContext: - _context = endPointContext; - break; - } - } } } \ No newline at end of file diff --git a/mROA/Implementation/RemoteInstanceRepository.cs b/mROA/Implementation/RemoteInstanceRepository.cs index b360e77..e2dae41 100644 --- a/mROA/Implementation/RemoteInstanceRepository.cs +++ b/mROA/Implementation/RemoteInstanceRepository.cs @@ -10,7 +10,14 @@ namespace mROA.Implementation private List _producedProxys = new(); private ICallIndexProvider _callIndexProvider; - private IRepresentationModuleProducer? _representationProducer; + private IRepresentationModuleProducer _representationProducer; + + public RemoteInstanceRepository(ICallIndexProvider callIndexProvider, IRepresentationModuleProducer representationProducer, int hostId) + { + _callIndexProvider = callIndexProvider; + _representationProducer = representationProducer; + HostId = hostId; + } public int HostId { get; set; } @@ -76,18 +83,5 @@ namespace mROA.Implementation throw new NotSupportedException(); } - - public void Inject(object dependency) - { - switch (dependency) - { - case IRepresentationModuleProducer serialisationModule: - _representationProducer = serialisationModule; - break; - case ICallIndexProvider callIndexProvider: - _callIndexProvider = callIndexProvider; - break; - } - } } } \ No newline at end of file diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index 0b7e209..2b25dd9 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -12,20 +12,13 @@ namespace mROA.Implementation { public class RepresentationModule : IRepresentationModule { - private IChannelInteractionModule? _interaction; - private IContextualSerializationToolKit? _serialization; + private IChannelInteractionModule _interaction; + private IContextualSerializationToolKit _serialization; - public void Inject(object dependency) + public RepresentationModule(IChannelInteractionModule interaction, IContextualSerializationToolKit serialization) { - switch (dependency) - { - case IContextualSerializationToolKit toolkit: - _serialization = toolkit; - break; - case IChannelInteractionModule interactionModule: - _interaction = interactionModule; - break; - } + _interaction = interaction; + _serialization = serialization; } diff --git a/mROA/Implementation/StaticRepresentationModuleProducer.cs b/mROA/Implementation/StaticRepresentationModuleProducer.cs index 11e9af0..cecef84 100644 --- a/mROA/Implementation/StaticRepresentationModuleProducer.cs +++ b/mROA/Implementation/StaticRepresentationModuleProducer.cs @@ -5,7 +5,12 @@ namespace mROA.Implementation { public class StaticRepresentationModuleProducer : IRepresentationModuleProducer { - private IRepresentationModule? _representationModule; + private readonly IRepresentationModule _representationModule; + + public StaticRepresentationModuleProducer(IRepresentationModule representationModule) + { + _representationModule = representationModule; + } public IRepresentationModule Produce(int ownership) { @@ -13,11 +18,5 @@ namespace mROA.Implementation throw new NullReferenceException("The representation module is not initialized."); return _representationModule; } - - public void Inject(object dependency) - { - if (dependency is IRepresentationModule serialisationModule) - _representationModule = serialisationModule; - } } } \ No newline at end of file diff --git a/mROA/mROA.csproj b/mROA/mROA.csproj index 37ecbb2..cc70622 100644 --- a/mROA/mROA.csproj +++ b/mROA/mROA.csproj @@ -26,6 +26,8 @@ + +