private Task RunClient <T>(ICommonSerializer serializer, int port, Action <Poller> loadPoller, Action <T> loadProxy)
            where T : class
        {
            var task = new Task(() =>
            {
                var clientContext           = NetMQContext.Create();
                var clientSocket            = clientContext.CreateRequestSocket();     // clientContext.CreateRouterSocket();
                clientSocket.Options.Linger = TimeSpan.Zero;
                var clientPoller            = new Poller(clientSocket);
                var clientScheduler         = new NetMQScheduler(clientContext, clientPoller);
                var clientTransport         = clientSocket.GenerateTransportSource(clientScheduler);
                var clientRouter            = new DefaultMessageRouter(clientTransport, serializer);
                var proxy = clientRouter.AddInterface <T>();
                clientSocket.Connect("tcp://localhost:" + port);
                loadPoller.Invoke(clientPoller);
                loadProxy.Invoke(proxy);

                clientPoller.PollTillCancelled();

                clientScheduler.Dispose();
                clientPoller.Dispose();
                clientRouter.Dispose();
                clientTransport.Dispose();
                clientSocket.Dispose();
                clientContext.Dispose();
            }, TaskCreationOptions.LongRunning);

            task.Start();
            return(task);
        }
        private Task RunServer <T>(ICommonSerializer serializer, Action <int> loadPort, Action <Poller> loadPoller, T service)
            where T : class
        {
            var task = new Task(() =>
            {
                var serverContext   = NetMQContext.Create();
                var serverSocket    = serverContext.CreateResponseSocket();             // serverContext.CreateRouterSocket();
                var serverPoller    = new Poller(serverSocket);
                var serverScheduler = new NetMQScheduler(serverContext, serverPoller);
                var serverTransport = serverSocket.GenerateTransportSource(serverScheduler);
                var serverRouter    = new DefaultMessageRouter(serverTransport, serializer);
                serverRouter.AddService(service);
                var port = serverSocket.BindRandomPort("tcp://localhost");
                loadPoller.Invoke(serverPoller);
                loadPort.Invoke(port);

                serverPoller.PollTillCancelled();

                serverScheduler.Dispose();
                serverPoller.Dispose();
                serverRouter.Dispose();
                serverTransport.Dispose();
                serverSocket.Dispose();
                serverContext.Dispose();
            }, TaskCreationOptions.LongRunning);

            task.Start();
            return(task);
        }
Example #3
0
 public static Byte[] SerializeToByteArray <T>(this ICommonSerializer target, T value)
 {
     using (var stream = new MemoryStream())
     {
         target.Serialize(stream, value);
         return(stream.ToArray());
     }
 }
Example #4
0
            public InterfaceInterceptor(ICommonWebSocket socket, ICommonSerializer serializer, string hubName)
            {
                _socket     = socket;
                _serializer = serializer;
                _hubName    = hubName;

                _socket.Received += OnReceived;
            }
Example #5
0
 public DefaultMessageRouter(ITransportSource transportSource, ICommonSerializer serializer,
                             IProxyObjectGenerator proxyObjectGenerator = null, IServiceWrapperGenerator serviceWrapperGenerator = null)
 {
     TransportSource           = transportSource;
     TransportSource.Received += TransportSourceOnReceived;
     Serializer              = serializer;
     ProxyObjectGenerator    = proxyObjectGenerator ?? new DefaultProxyObjectGenerator();
     ServiceWrapperGenerator = serviceWrapperGenerator ?? new DefaultServiceWrapperGenerator();
 }
        public IMessageHandler Create(IMessageHandler handler, ICommonSerializer serializer, object service)
        {
            // subscribe to events on the service and forward them to the transport
            // generate a method that can handle incoming messages
            // it needs to send the results to the caller
            // do we need to tell the servive about the caller? no. nice but not required. we can still call a method to get current state

            var className = "WrapperFor" + service.GetType().Name;

            var assemblies = new HashSet <string>();

            foreach (var loaded in AppDomain.CurrentDomain.GetAssemblies())
            {
                if (!loaded.IsDynamic && loaded.FullName.StartsWith("System"))
                {
                    assemblies.Add(loaded.Location);
                }
            }

            var requestTypes = new List <string>();
            var returnTypes  = new List <Type>();
            var code         = GenerateClassDefinition(className, assemblies, service, requestTypes, returnTypes);
            var assembly     = CompileAndLoadClassDefinition(code, className, assemblies);

            foreach (var rType in returnTypes.Distinct())
            {
                var inh = typeof(ResponseMessage <>).MakeGenericType(rType);
                serializer.RegisterSubtype <Message>(inh, inh.GetHashCode());
            }

            foreach (var rType in assembly.GetTypes().Where(t => requestTypes.Contains(t.Name)))
            {
                var inh = typeof(RequestMessage <>).MakeGenericType(rType);
                serializer.RegisterSubtype <Message>(inh, inh.GetHashCode());
            }


            var type = assembly.GetType(className);

            return((IMessageHandler)Activator.CreateInstance(type, handler, serializer, service));
        }
Example #7
0
        public T Create <T>(IMessageHandler handler, ICommonSerializer serializer, string serviceName)
            where T : class
        {
            if (!typeof(T).IsInterface)
            {
                throw new ArgumentException("Datatype should be interface: " + typeof(T));
            }

            var className = "ProxyFor" + typeof(T).Name;

            var assemblies = new HashSet <string>();

            foreach (var loaded in AppDomain.CurrentDomain.GetAssemblies())
            {
                if (!loaded.IsDynamic && loaded.FullName.StartsWith("System"))
                {
                    assemblies.Add(loaded.Location);
                }
            }

            var requestTypes = new List <string>();
            var returnTypes  = new List <Type>();
            var code         = GenerateClassDefinition <T>(className, assemblies, requestTypes, returnTypes);
            var assembly     = CompileAndLoadClassDefinition(code, className, assemblies);

            foreach (var rType in returnTypes.Distinct())
            {
                var inh = typeof(ResponseMessage <>).MakeGenericType(rType);
                serializer.RegisterSubtype <Message>(inh, inh.GetHashCode());
            }

            foreach (var rType in assembly.GetTypes().Where(t => requestTypes.Contains(t.Name)))
            {
                var inh = typeof(RequestMessage <>).MakeGenericType(rType);
                serializer.RegisterSubtype <Message>(inh, inh.GetHashCode());
            }

            var type = assembly.GetType(className);

            return((T)Activator.CreateInstance(type, handler, serializer, serviceName));
        }
		public IMessageHandler Create(IMessageHandler handler, ICommonSerializer serializer, object service)
		{
			// subscribe to events on the service and forward them to the transport
			// generate a method that can handle incoming messages
			// it needs to send the results to the caller
			// do we need to tell the servive about the caller? no. nice but not required. we can still call a method to get current state

			var className = "WrapperFor" + service.GetType().Name;

			var assemblies = new HashSet<string>();

			foreach (var loaded in AppDomain.CurrentDomain.GetAssemblies())
				if (!loaded.IsDynamic && loaded.FullName.StartsWith("System"))
					assemblies.Add(loaded.Location);

			var requestTypes = new List<string>();
			var returnTypes = new List<Type>();
			var code = GenerateClassDefinition(className, assemblies, service, requestTypes, returnTypes);
			var assembly = CompileAndLoadClassDefinition(code, className, assemblies);

			foreach (var rType in returnTypes.Distinct())
			{
				var inh = typeof(ResponseMessage<>).MakeGenericType(rType);
				serializer.RegisterSubtype<Message>(inh, inh.GetHashCode());
			}

			foreach (var rType in assembly.GetTypes().Where(t => requestTypes.Contains(t.Name)))
			{
				var inh = typeof(RequestMessage<>).MakeGenericType(rType);
				serializer.RegisterSubtype<Message>(inh, inh.GetHashCode());
			}


			var type = assembly.GetType(className);
			return (IMessageHandler)Activator.CreateInstance(type, handler, serializer, service);
		}
Example #9
0
 protected ProxyBase(IMessageHandler handler, ICommonSerializer serializer, string hubName)
 {
     _handler    = handler;
     _hubName    = hubName;
     _serializer = serializer;
 }
Example #10
0
 public T Create <T>(ICommonWebSocket socket, ICommonSerializer serializer) where T : class
 {
     ValidateInterface(typeof(T));
     return(_generator.CreateInterfaceProxyWithoutTarget <T>(new InterfaceInterceptor(socket, serializer, typeof(T).Name)));
 }