diff --git a/mROA.Performance/obj/Release/net9.0/mROA.Performance.AssemblyInfo.cs b/mROA.Performance/obj/Release/net9.0/mROA.Performance.AssemblyInfo.cs index ab22524..d0633e2 100644 --- a/mROA.Performance/obj/Release/net9.0/mROA.Performance.AssemblyInfo.cs +++ b/mROA.Performance/obj/Release/net9.0/mROA.Performance.AssemblyInfo.cs @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. // //------------------------------------------------------------------------------ @@ -13,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Performance")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+da60eb27f99600ee3a9ee8526d2b26260efd8225")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2f1a1e250b1a9c031df21e3ec1087cb18b8fa784")] [assembly: System.Reflection.AssemblyProductAttribute("mROA.Performance")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Performance")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/mROA.Performance/obj/mROA.Performance.csproj.nuget.g.props b/mROA.Performance/obj/mROA.Performance.csproj.nuget.g.props index 89910f0..566ee42 100644 --- a/mROA.Performance/obj/mROA.Performance.csproj.nuget.g.props +++ b/mROA.Performance/obj/mROA.Performance.csproj.nuget.g.props @@ -5,15 +5,12 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Mikhail\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\Mimm\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 6.12.0 + 6.10.1 - + - - C:\Users\Mikhail\.nuget\packages\nunit.analyzers\4.3.0 - \ No newline at end of file diff --git a/mROA.Test/ITestController.cs b/mROA.Test/ITestController.cs index 48a1e1d..c2c2722 100644 --- a/mROA.Test/ITestController.cs +++ b/mROA.Test/ITestController.cs @@ -9,12 +9,16 @@ public interface ITestController Task AAsync(CancellationToken cancellationToken); int B(); Task BAsync(CancellationToken cancellationToken); + + TransmittedSharedObject SharedObjectTransmitionTest(); } [SharedObjectSingleton] public class TestController : ITestController { + public ITestController? ReturnIfNotNull; private int _bOut = 5; + public void A() { Console.WriteLine("A called"); @@ -34,4 +38,40 @@ public class TestController : ITestController { return Task.FromResult(5); } + + public TransmittedSharedObject SharedObjectTransmitionTest() + { + return new TransmittionTestController { ReturnIfNotNull = ReturnIfNotNull ?? new TestController() }; + } +} + +public class TransmittionTestController : ITestController +{ + public ITestController ReturnIfNotNull; + + public void A() + { + Console.WriteLine("A called alternative"); + } + + public Task AAsync(CancellationToken cancellationToken) + { + Thread.Sleep(500); + return Task.CompletedTask; + } + + public int B() + { + return 456789; + } + + public Task BAsync(CancellationToken cancellationToken) + { + return Task.FromResult(465789); + } + + public TransmittedSharedObject SharedObjectTransmitionTest() + { + return new TestController { ReturnIfNotNull = this }; + } } \ No newline at end of file diff --git a/mROA.Test/UnitTest1.cs b/mROA.Test/UnitTest1.cs index 439e156..2360e94 100644 --- a/mROA.Test/UnitTest1.cs +++ b/mROA.Test/UnitTest1.cs @@ -1,6 +1,9 @@ using System.Diagnostics; using System.Reflection; +using System.Text.Json; using mROA.Implementation; +using Newtonsoft.Json; +using JsonSerializer = System.Text.Json.JsonSerializer; namespace mROA.Test; @@ -11,9 +14,9 @@ public class Tests private IExecuteModule _executeModule; private IMethodRepository _methodRepository; private IContextRepository _contextRepository; - + private ITestController _testController; - + [SetUp] public void Setup() { @@ -25,9 +28,9 @@ public class Tests var repo2 = new ContextRepository(); repo2.FillSingletons(Assembly.GetExecutingAssembly()); _contextRepository = repo2; - - _executeModule = new PrepairedExecutionModule(_methodRepository, _serialisationModule, _contextRepository); + _executeModule = new PrepairedExecutionModule(_methodRepository, _serialisationModule, _contextRepository); + TransmissionConfig.DefaultContextRepository = _contextRepository; } [Test] @@ -41,7 +44,7 @@ public class Tests "CommandId": 2 } """); - Assert.Pass(sw.ElapsedMilliseconds.ToString()); + Assert.Pass(_interactionModule.OutputBuffer.Last()); } [Test] @@ -55,18 +58,18 @@ public class Tests } """); while (_interactionModule.OutputBuffer.Count != 2) ; - - Assert.Pass(sw.ElapsedMilliseconds.ToString()); + + Assert.Pass(_interactionModule.OutputBuffer.Last()); } - + [Test] public void MethodRegistrationTest() { var repo = new MethodRepository(); repo.CollectForAssembly(Assembly.GetExecutingAssembly()); - Assert.That(repo.GetMethods().ToList().Count == 4); + Assert.That(repo.GetMethods().ToList().Count == 5); } - + [Test] public void ContextSupplyTest() { @@ -76,4 +79,45 @@ public class Tests singleObject.B(); Assert.That(singleObject.B() == 6); } + + [Test] + public void TransmissionTest() + { + _interactionModule.PassCommand(132, """ + { + "CommandId": 4 + } + """); + var response = + JsonSerializer.Deserialize>( + JsonSerializer.Deserialize(_interactionModule.OutputBuffer.Last()) + ?.Result.ToString() + ); + + _interactionModule.PassCommand(132, + JsonSerializer.Serialize(new JsonCallRequest { CommandId = 2, ObjectId = response.ContextId })); + + var firstFull = JsonDocument.Parse(_interactionModule.OutputBuffer.Last()).RootElement.GetProperty("Result") + .GetInt32(); + + _interactionModule.PassCommand(132, + JsonSerializer.Serialize(new JsonCallRequest { CommandId = 4, ObjectId = response.ContextId })); + + response = + JsonSerializer.Deserialize>( + JsonSerializer.Deserialize(_interactionModule.OutputBuffer.Last()) + ?.Result.ToString() + ); + + _interactionModule.PassCommand(132, + JsonSerializer.Serialize(new JsonCallRequest { CommandId = 2, ObjectId = response.ContextId })); + _interactionModule.PassCommand(132, + JsonSerializer.Serialize(new JsonCallRequest { CommandId = 2, ObjectId = response.ContextId })); + + var secondFull = JsonDocument.Parse(_interactionModule.OutputBuffer.Last()).RootElement.GetProperty("Result") + .GetInt32(); + + Assert.That(firstFull == 456789 && secondFull == 6); + + } } \ No newline at end of file diff --git a/mROA.Test/mROA.Test.csproj b/mROA.Test/mROA.Test.csproj index 1b7197f..4262b31 100644 --- a/mROA.Test/mROA.Test.csproj +++ b/mROA.Test/mROA.Test.csproj @@ -9,15 +9,21 @@ - - - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - + diff --git a/mROA.Test/obj/Release/net9.0/mROA.Test.AssemblyInfo.cs b/mROA.Test/obj/Release/net9.0/mROA.Test.AssemblyInfo.cs index 1410f8c..093b6a7 100644 --- a/mROA.Test/obj/Release/net9.0/mROA.Test.AssemblyInfo.cs +++ b/mROA.Test/obj/Release/net9.0/mROA.Test.AssemblyInfo.cs @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. // //------------------------------------------------------------------------------ @@ -13,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+da60eb27f99600ee3a9ee8526d2b26260efd8225")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2f1a1e250b1a9c031df21e3ec1087cb18b8fa784")] [assembly: System.Reflection.AssemblyProductAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA.Test")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/mROA.Test/obj/mROA.Test.csproj.nuget.g.props b/mROA.Test/obj/mROA.Test.csproj.nuget.g.props index 6c254f5..3598713 100644 --- a/mROA.Test/obj/mROA.Test.csproj.nuget.g.props +++ b/mROA.Test/obj/mROA.Test.csproj.nuget.g.props @@ -5,22 +5,22 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Mikhail\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\Mimm\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 6.12.0 + 6.10.1 - + - - - - + + + + - C:\Users\Mikhail\.nuget\packages\nunit.analyzers\4.3.0 + C:\Users\Mimm\.nuget\packages\nunit.analyzers\4.6.0 \ No newline at end of file diff --git a/mROA.Test/obj/mROA.Test.csproj.nuget.g.targets b/mROA.Test/obj/mROA.Test.csproj.nuget.g.targets index 56b5729..48aaef6 100644 --- a/mROA.Test/obj/mROA.Test.csproj.nuget.g.targets +++ b/mROA.Test/obj/mROA.Test.csproj.nuget.g.targets @@ -1,8 +1,8 @@  - - - + + + \ No newline at end of file diff --git a/mROA/Abstract/IContextRepository.cs b/mROA/Abstract/IContextRepository.cs index 4b27db2..e11c95c 100644 --- a/mROA/Abstract/IContextRepository.cs +++ b/mROA/Abstract/IContextRepository.cs @@ -6,4 +6,5 @@ public interface IContextRepository void ClearObject(int id); object GetObject(int id); object GetSingleObject(Type type); + int GetObjectIndex(object o); } \ No newline at end of file diff --git a/mROA/Implementation/SharedObjectInterafceAttribute.cs b/mROA/Implementation/Attributes/SharedObjectInterafceAttribute.cs similarity index 100% rename from mROA/Implementation/SharedObjectInterafceAttribute.cs rename to mROA/Implementation/Attributes/SharedObjectInterafceAttribute.cs diff --git a/mROA/Implementation/SharedObjectSingletonAttribute.cs b/mROA/Implementation/Attributes/SharedObjectSingletonAttribute.cs similarity index 100% rename from mROA/Implementation/SharedObjectSingletonAttribute.cs rename to mROA/Implementation/Attributes/SharedObjectSingletonAttribute.cs diff --git a/mROA/Implementation/ContextRepository.cs b/mROA/Implementation/ContextRepository.cs index 1002840..9b51f07 100644 --- a/mROA/Implementation/ContextRepository.cs +++ b/mROA/Implementation/ContextRepository.cs @@ -7,9 +7,8 @@ public class ContextRepository : IContextRepository { private FrozenDictionary _singletons; private object[] _storage; - private int _lastIndex; - private Task? _lastIndexFinder; + private Task? _lastIndexFinder = Task.FromResult(0); const int StartupSize = 1024; const int GrowSize = 128; @@ -32,15 +31,13 @@ public class ContextRepository : IContextRepository { if (_lastIndexFinder is not null) _lastIndexFinder.Wait(); + + _storage[_lastIndexFinder.Result] = o; - var oldIndex = _lastIndex; - _lastIndex = _lastIndexFinder.Result; - - _storage[oldIndex] = o; - + var last = _lastIndexFinder.Result; _lastIndexFinder = FindLastIndex(); - return _lastIndex; + return last; } public void ClearObject(int id) @@ -59,6 +56,14 @@ public class ContextRepository : IContextRepository return _singletons.TryGetValue(type.GetHashCode(), out var value) ? value : null; } + public int GetObjectIndex(object o) + { + var index = Array.IndexOf(_storage, o); + if (index == -1) + return ResisterObject(o); + return index; + } + private async Task FindLastIndex() { for (int i = 0; i < _storage.Length; i++) diff --git a/mROA/Implementation/JsonSerialisationModule.cs b/mROA/Implementation/JsonSerialisationModule.cs index 55a0172..08104b9 100644 --- a/mROA/Implementation/JsonSerialisationModule.cs +++ b/mROA/Implementation/JsonSerialisationModule.cs @@ -12,19 +12,15 @@ public class JsonSerialisationModule : ISerialisationModule { _dataSource = dataSource; _dataSource.SetMessageHandler(HandleIncomingRequest); - } + } public void SetExecuteModule(IExecuteModule executeModule) => _executeModule = executeModule; public void HandleIncomingRequest(int clientId, string command) { - - JsonCallRequest request = JsonSerializer.Deserialize(command); - - - request.ClientId = clientId; + var response = _executeModule.Execute(request); PostResponse(response); } diff --git a/mROA/Implementation/TransmittedSharedObject.cs b/mROA/Implementation/TransmittedSharedObject.cs new file mode 100644 index 0000000..353f1c6 --- /dev/null +++ b/mROA/Implementation/TransmittedSharedObject.cs @@ -0,0 +1,27 @@ +using System.Text.Json.Serialization; + +namespace mROA.Implementation; + +public static class TransmissionConfig +{ + public static IContextRepository DefaultContextRepository { get; set; } +} + +public class TransmittedSharedObject +{ + public int ContextId { get; set; } = -1; + + [JsonIgnore] + public T Value { get; set; } + + [JsonIgnore] + public IContextRepository Context { get; set; } + + public static implicit operator T(TransmittedSharedObject value) => value.Value; + + public static implicit operator TransmittedSharedObject(T value) => + new() { Value = value, ContextId = TransmissionConfig.DefaultContextRepository.GetObjectIndex(value) }; + + // public void Fill() => Value = (T)TransmissionConfig.DefaultContextRepository.GetObject(ContextId); + // public void Collect() => ContextId = TransmissionConfig.DefaultContextRepository.GetObjectIndex(ContextId); +} \ No newline at end of file diff --git a/mROA/obj/Release/net9.0/mROA.AssemblyInfo.cs b/mROA/obj/Release/net9.0/mROA.AssemblyInfo.cs index 2ed3e1a..3bbc395 100644 --- a/mROA/obj/Release/net9.0/mROA.AssemblyInfo.cs +++ b/mROA/obj/Release/net9.0/mROA.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("mROA")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+da60eb27f99600ee3a9ee8526d2b26260efd8225")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2f1a1e250b1a9c031df21e3ec1087cb18b8fa784")] [assembly: System.Reflection.AssemblyProductAttribute("mROA")] [assembly: System.Reflection.AssemblyTitleAttribute("mROA")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/mROA/obj/mROA.csproj.nuget.g.props b/mROA/obj/mROA.csproj.nuget.g.props index 721d876..566ee42 100644 --- a/mROA/obj/mROA.csproj.nuget.g.props +++ b/mROA/obj/mROA.csproj.nuget.g.props @@ -5,12 +5,12 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Mikhail\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\Mimm\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 6.12.0 + 6.10.1 - + \ No newline at end of file