/// <summary>
        /// Returns an IObserver used to send messages to the remote host at
        /// the specified IPEndpoint.
        /// </summary>
        /// <param name="remoteEndpoint">The IPEndpoint of the remote host</param>
        /// <returns>An IObserver used to send messages to the remote host</returns>
        public IObserver <T> GetRemoteObserver(IPEndPoint remoteEndpoint)
        {
            if (remoteEndpoint == null)
            {
                throw new ArgumentNullException("remoteEndpoint");
            }

            ProxyObserver remoteObserver;

            if (!_cachedClients.TryGetValue(remoteEndpoint, out remoteObserver))
            {
                WritableTransportClient <IWritableRemoteEvent <T> > client =
                    new WritableTransportClient <IWritableRemoteEvent <T> >(remoteEndpoint, _observerContainer, _injector);

                remoteObserver = new ProxyObserver(client);
                _cachedClients[remoteEndpoint] = remoteObserver;
            }

            return(remoteObserver);
        }
 /// <summary>
 /// Create new ProxyObserver
 /// </summary>
 /// <param name="client">The connected WritableTransport client used to send
 /// messages to remote host</param>
 public ProxyObserver(WritableTransportClient <IWritableRemoteEvent <T> > client)
 {
     _client = client;
 }