public static TServiceContext Create <TServiceContext>(params object[] stubServices) where TServiceContext : ServiceContextBase, new() { var services = Program.AddServices(new ServiceCollection()); foreach (var stubService in stubServices) { services.AddStubs(stubService); } var serviceProvider = services.BuildServiceProvider(); Program.ConfigureApplicationCommands(serviceProvider.GetRequiredService <CommandLineApplicationServices>()); var serviceContext = new TServiceContext(); foreach (var property in serviceContext.GetType().GetTypeInfo().DeclaredProperties) { if (property.CanWrite) { var service = serviceProvider.GetRequiredService(property.PropertyType); property.SetValue(serviceContext, service); } } return(serviceContext); }
private void RegisterService(string serviceId, string serviceResponseReceiverId) { using (EneterTrace.Entering()) { bool anIsNewServiceRegistered = false; TServiceContext aServiceContext = null; using (ThreadLock.Lock(myConnectionLock)) { aServiceContext = myConnectedServices.FirstOrDefault(x => x.ServiceId == serviceId || x.ServiceResponseReceiverId == serviceResponseReceiverId); if (aServiceContext == null) { aServiceContext = new TServiceContext(serviceId, serviceResponseReceiverId); myConnectedServices.Add(aServiceContext); anIsNewServiceRegistered = true; } } if (anIsNewServiceRegistered) { if (ServiceRegistered != null) { try { MessageBusServiceEventArgs anEvent = new MessageBusServiceEventArgs(serviceId, serviceResponseReceiverId); ServiceRegistered(this, anEvent); } catch (Exception err) { EneterTrace.Error(TracedObject + ErrorHandler.DetectedException, err); } } } else { // If this connection has registered the same service then do nothing. if (aServiceContext.ServiceId == serviceId && aServiceContext.ServiceResponseReceiverId == serviceResponseReceiverId) { } else if (aServiceContext.ServiceId != serviceId && aServiceContext.ServiceResponseReceiverId == serviceResponseReceiverId) { EneterTrace.Warning("The connection has already registered a different service '" + aServiceContext.ServiceId + "'. Connection will be disconnected."); UnregisterService(serviceResponseReceiverId); } else if (aServiceContext.ServiceId == serviceId && aServiceContext.ServiceResponseReceiverId != serviceResponseReceiverId) { EneterTrace.Warning("Service '" + serviceId + "' is already registered. Connection will be disconnected."); UnregisterService(serviceResponseReceiverId); } } } }
private void RegisterClient(string clientResponseReceiverId, string serviceId) { using (EneterTrace.Entering()) { bool anIsNewClientConnected = false; TClientContext aClientContext = null; using (ThreadLock.Lock(myConnectionLock)) { aClientContext = myConnectedClients.FirstOrDefault(x => x.ClientResponseReceiverId == clientResponseReceiverId); // If such client does not exist yet then create it. if (aClientContext == null) { TServiceContext aServiceContext = myConnectedServices.FirstOrDefault(x => x.ServiceId == serviceId); // If requested service exists. if (aServiceContext != null) { aClientContext = new TClientContext(clientResponseReceiverId, serviceId, aServiceContext.ServiceResponseReceiverId); myConnectedClients.Add(aClientContext); anIsNewClientConnected = true; } } } if (anIsNewClientConnected) { // Send open connection message to the service. try { MessageBusMessage aMessage = new MessageBusMessage(EMessageBusRequest.ConnectClient, clientResponseReceiverId, null); object aSerializedMessage = mySerializer.Serialize <MessageBusMessage>(aMessage); IDuplexInputChannel anInputChannel = myServiceConnector.AttachedDuplexInputChannel; if (anInputChannel != null) { anInputChannel.SendResponseMessage(aClientContext.ServiceResponseReceiverId, aSerializedMessage); } } catch (Exception err) { EneterTrace.Warning(TracedObject + "failed to send open connection message to the service '" + aClientContext.ServiceId + "'.", err); // Note: The service should not be disconnected from the message bus when not available. // Because it can be "just" overloaded. So only this new client will be disconnected from the message bus. UnregisterClient(clientResponseReceiverId, false, true); } } else { if (aClientContext != null) { EneterTrace.Warning(TracedObject + "failed to connect the client already exists. The connection will be closed."); UnregisterClient(clientResponseReceiverId, false, true); } else { EneterTrace.Warning(TracedObject + "failed to connec the client because the service '" + serviceId + "' does not exist. The connection will be closed."); UnregisterClient(clientResponseReceiverId, false, true); } } } }