/// <summary>
        /// Creates, builds and returns connector
        /// </summary>
        public override WebSocketModelConnector Build()
        {
            if (Connector != null)
            {
                return(Connector);
            }

            Connector = new WebSocketModelConnector <TIdentifier>(ReconnectInterval);
            ConfigureConnector(Connector);
            return(Connector);
        }
        /// <summary>
        /// Creates new websocket connector and registers IWebSocketBus to the MSDI container.
        /// </summary>
        public static IServiceCollection AddWebSocketClient <TIdentifer>(this IServiceCollection services, Action <HorseWebSocketBuilder> config)
        {
            HorseWebSocketBuilder <TIdentifer> builder = new HorseWebSocketBuilder <TIdentifer>();

            config(builder);

            WebSocketModelConnector <TIdentifer> connector = (WebSocketModelConnector <TIdentifer>)builder.Build();

            AddMSDIHandlers(services, connector, builder);
            services.AddSingleton(connector);
            services.AddSingleton <IWebSocketBus <TIdentifer> >(connector);

            return(services);
        }
        private static void AddMSDIHandlers(IServiceCollection services, WebSocketModelConnector connector, HorseWebSocketBuilder builder)
        {
            foreach (Tuple <ServiceLifetime, Type> pair in builder.AssembyConsumers)
            {
                List <Type> types = connector.Observer.ResolveWebSocketHandlerTypes(pair.Item2);
                foreach (Type type in types)
                {
                    AddHandlerIntoMSDI(services, pair.Item1, type);
                }
            }

            foreach (Tuple <ServiceLifetime, Type, Type> tuple in builder.IndividualConsumers)
            {
                AddHandlerIntoMSDI(services, tuple.Item1, tuple.Item2);
            }
        }
        /// <summary>
        /// Uses Websocket Client and connects to the server.
        /// This method should be used for only MSDI Provider.
        /// </summary>
        public static IServiceProvider UseWebSocketClient(this IServiceProvider provider)
        {
            WebSocketModelConnector connector = provider.GetService <WebSocketModelConnector>();

            connector.ServiceProvider = provider;

            foreach (Tuple <ServiceLifetime, Type> pair in connector.Builder.AssembyConsumers)
            {
                connector.Observer.RegisterWebSocketHandlers(type => connector.ServiceProvider.GetService(type), pair.Item2);
            }

            foreach (Tuple <ServiceLifetime, Type, Type> tuple in connector.Builder.IndividualConsumers)
            {
                connector.Observer.RegisterWebSocketHandler(tuple.Item2, tuple.Item3, null, type => connector.ServiceProvider.GetService(type));
            }

            connector.Builder = null;

            connector.Run();
            return(provider);
        }