Exemple #1
0
        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);
        }
Exemple #2
0
        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);
                    }
                }
            }
        }
Exemple #3
0
        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);
                    }
                }
            }
        }