예제 #1
0
        /// <summary>
        /// Handles Invoke method responses received from the other hub server.
        /// </summary>
        protected void OnResponse_VM(object sender, ResponseVMEventArgs e)
        {
            var eventArgs = e as InvokeResponseEventArgs;

            if (eventArgs != null)
            {
                var args = new List <object>(eventArgs.MethodArgs);

                if (eventArgs.Metadata?.ContainsKey(CONNECTION_ID_TOKEN) == true)
                {
                    var    connectionData = eventArgs.Metadata[CONNECTION_ID_TOKEN];
                    object connectionId   = connectionData.StartsWith("[") ? (object)JsonSerializer.Deserialize <List <string> >(connectionData) : connectionData;

                    if (eventArgs.MethodName == nameof(IDotNetifyHubResponse.SendToGroupExceptAsync))
                    {
                        args.Insert(1, connectionId);
                    }
                    else
                    {
                        args.Insert(0, connectionId);
                    }
                }
                ;

                _hubResponse.GetType().GetMethod(eventArgs.MethodName).Invoke(_hubResponse, args.ToArray());
                e.Handled = true;
            }
        }
예제 #2
0
        /// <summary>
        /// Handles incoming Response_VM message.
        /// </summary>
        private Task OnResponse_VM(object[] payload)
        {
            if (payload == null || payload.Length != 2)
            {
                return(Task.CompletedTask);
            }

            // SignalR .NET Core is sending an array of arguments.
            var vmId    = $"{payload[0]}";
            var rawData = payload[1].ToString();
            var data    = JsonConvert.DeserializeObject <Dictionary <string, object> >(rawData);

            var eventArgs = new ResponseVMEventArgs {
                VMId = vmId, Data = data
            };
            var args = new object[] { this, eventArgs };

            foreach (Delegate d in Response_VM?.GetInvocationList())
            {
                d.DynamicInvoke(args);
                if (eventArgs.Handled)
                {
                    break;
                }
            }

            // If we get to this point, that means the server holds a view model instance
            // whose view no longer existed.  So, tell the server to dispose the view model.
            if (!eventArgs.Handled)
            {
                var task = Dispose_VM(vmId);
            }

            return(Task.CompletedTask);
        }
예제 #3
0
 /// <summary>
 /// Handles response received from the server.
 /// </summary>
 private void OnResponseReceived(object sender, ResponseVMEventArgs e)
 {
     if (e.VMId == _vmId)
     {
         e.Handled = true;
         _viewState.Set(Preprocess(e.Data));
     }
 }
예제 #4
0
        public async Task DotNetifyClient_ResponseCRUD()
        {
            var mockHubProxy = Substitute.For <IDotNetifyHubProxy>();
            var sut          = new DotNetifyClient(mockHubProxy, new DefaultUIThreadDispatcher());

            var helloWorldVM = new HelloWorldVM();
            await sut.ConnectAsync(nameof(HelloWorldVM), helloWorldVM);

            var eventArgs = new ResponseVMEventArgs()
            {
                VMId = nameof(HelloWorldVM),
                Data = new Dictionary <string, object>
                {
                    { "List_itemKey", "Id" }
                }
            };

            mockHubProxy.Response_VM += Raise.EventWith(new object(), eventArgs);

            eventArgs.Handled = false;
            eventArgs.Data    = new Dictionary <string, object>
            {
                { "List_add", "{ Id: 1, Name: 'Item_A'}" }
            };

            mockHubProxy.Response_VM += Raise.EventWith(new object(), eventArgs);

            Assert.AreEqual(1, helloWorldVM.List.Count);
            Assert.AreEqual(1, helloWorldVM.List[0].Id);
            Assert.AreEqual("Item_A", helloWorldVM.List[0].Name);

            eventArgs.Handled = false;
            eventArgs.Data    = new Dictionary <string, object>
            {
                { "List_update", "{ Id: 1, Name: 'Item_ABC'}" }
            };

            mockHubProxy.Response_VM += Raise.EventWith(new object(), eventArgs);

            Assert.AreEqual(1, helloWorldVM.List.Count);
            Assert.AreEqual(1, helloWorldVM.List[0].Id);
            Assert.AreEqual("Item_ABC", helloWorldVM.List[0].Name);

            eventArgs.Handled = false;
            eventArgs.Data    = new Dictionary <string, object>
            {
                { "List_remove", "1" }
            };

            mockHubProxy.Response_VM += Raise.EventWith(new object(), eventArgs);

            Assert.AreEqual(0, helloWorldVM.List.Count);
        }
예제 #5
0
        public async Task DotNetifyClient_Response()
        {
            var mockHubProxy = Substitute.For <IDotNetifyHubProxy>();
            var sut          = new DotNetifyClient(mockHubProxy, new DefaultUIThreadDispatcher());

            var helloWorldVM = new HelloWorldVM();
            await sut.ConnectAsync(nameof(HelloWorldVM), helloWorldVM);

            var eventArgs = new ResponseVMEventArgs()
            {
                VMId = nameof(HelloWorldVM),
                Data = new Dictionary <string, object>
                {
                    { "FirstName", "Hello" },
                    { "LastName", "World" }
                }
            };

            mockHubProxy.Response_VM += Raise.EventWith(new object(), eventArgs);

            Assert.AreEqual(helloWorldVM.FirstName, "Hello");
            Assert.AreEqual(helloWorldVM.LastName, "World");
            Assert.IsTrue(eventArgs.Handled);
        }