добавлен мультиклиентский репозиторий

This commit is contained in:
2025-02-18 17:45:01 +03:00
parent e0c487ad73
commit ec5d594e4a
5 changed files with 93 additions and 6 deletions
+8 -2
View File
@@ -19,14 +19,20 @@ builder.Modules.Add(new HubRequestExtractor());
builder.UseBasicExecution(); builder.UseBasicExecution();
builder.Modules.Add(new RemoteContextRepository()); builder.Modules.Add(new RemoteContextRepository());
builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly); // builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly);
builder.Modules.Add(new MultiClientContextRepository(i =>
{
var repo = new ContextRepository();
repo.FillSingletons(typeof(PrinterFactory).Assembly);
return repo;
}));
builder.SetupMethodsRepository(new CoCodegenMethodRepository()); builder.SetupMethodsRepository(new CoCodegenMethodRepository());
builder.Modules.Add(new CreativeSerializationModuleProducer([builder.GetModule<JsonSerializationToolkit>()!], typeof(RepresentationModule))); builder.Modules.Add(new CreativeSerializationModuleProducer([builder.GetModule<JsonSerializationToolkit>()!], typeof(RepresentationModule)));
builder.Build(); builder.Build();
new RemoteTypeBinder(); new RemoteTypeBinder();
TransmissionConfig.RealContextRepository = builder.GetModule<ContextRepository>(); TransmissionConfig.RealContextRepository = builder.GetModule<MultiClientContextRepository>();
TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule<RemoteContextRepository>(); TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule<RemoteContextRepository>();
TransmissionConfig.OwnershipRepository = new MultiClientOwnershipRepository(); TransmissionConfig.OwnershipRepository = new MultiClientOwnershipRepository();
+1 -1
View File
@@ -27,7 +27,7 @@ TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule<RemoteCon
builder.GetModule<NetworkFrontendBridge>()!.Connect(); builder.GetModule<NetworkFrontendBridge>()!.Connect();
_ = builder.GetModule<RequestExtractor>()!.StartExtraction(); _ = builder.GetModule<RequestExtractor>()!.StartExtraction();
Console.WriteLine(TransmissionConfig.OwnershipRepository!.GetOwnershipId()); Console.WriteLine(TransmissionConfig.OwnershipRepository.GetOwnershipId());
var context = builder.GetModule<RemoteContextRepository>(); var context = builder.GetModule<RemoteContextRepository>();
var factory = context.GetSingleObject(typeof(IPrinterFactory)) as IPrinterFactory; var factory = context.GetSingleObject(typeof(IPrinterFactory)) as IPrinterFactory;
+6
View File
@@ -0,0 +1,6 @@
namespace mROA.Abstract;
public interface IContextRepositoryHub
{
IContextRepository GetRepository(int clientId);
}
@@ -0,0 +1,56 @@
using mROA.Abstract;
namespace mROA.Implementation.Backend;
public class MultiClientContextRepository(Func<int, IContextRepository> produceRepository) : IContextRepository, IContextRepositoryHub
{
private Dictionary<int, IContextRepository> _repositories = new();
private IContextRepository GetRepositoryByClientId(int clientId)
{
if (_repositories.TryGetValue(clientId, out var repository))
return repository;
var created = produceRepository(clientId);
_repositories.Add(clientId, created);
return created;
}
public void Inject<T>(T dependency)
{
}
public int ResisterObject(object o)
{
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).ResisterObject(o);
}
public void ClearObject(int id)
{
GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).ClearObject(id);
}
public object GetObject(int id)
{
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).GetObject(id);
}
public T? GetObject<T>(int id)
{
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).GetObject<T>(id);
}
public object GetSingleObject(Type type)
{
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).GetSingleObject(type);
}
public int GetObjectIndex(object o)
{
return GetRepositoryByClientId(TransmissionConfig.OwnershipRepository.GetOwnershipId()).GetObjectIndex(o);
}
public IContextRepository GetRepository(int clientId)
{
return _repositories[clientId];
}
}
+22 -3
View File
@@ -5,9 +5,28 @@ namespace mROA.Implementation;
public static class TransmissionConfig public static class TransmissionConfig
{ {
public static IContextRepository? RealContextRepository { get; set; } private static IContextRepository? _realContextRepository;
public static IContextRepository? RemoteEndpointContextRepository { get; set; } private static IContextRepository? _remoteEndpointContextRepository;
public static IOwnershipRepository? OwnershipRepository { get; set; } private static IOwnershipRepository? _ownershipRepository;
public static IContextRepository RealContextRepository
{
get => _realContextRepository ?? throw new NullReferenceException("RealContextRepository is null");
set => _realContextRepository = value;
}
public static IContextRepository RemoteEndpointContextRepository
{
get => _remoteEndpointContextRepository ?? throw new NullReferenceException("RemoteEndpointContextRepository is null");
set => _remoteEndpointContextRepository = value;
}
public static IOwnershipRepository OwnershipRepository
{
get => _ownershipRepository ?? throw new NullReferenceException("OwnershipRepository is null");
set => _ownershipRepository = value;
}
} }
public class SharedObject<T> where T : notnull public class SharedObject<T> where T : notnull