2013-04-16 12 views
8

Mam projekt, który teraz skonfigurowałem z BreezeJS. Nie wiedząc, co się dzieje wewnątrz BreezeJS w pełnym zakresie, ale po prostu zaakceptowałem, że to działa, mam moje przedmioty pokazane na ekranie w zasadzie z tego prostego polecenia.SignalR w połączeniu z Breeze

export function getProjects(projectsObservable, errorObservable) 
{ 
return breeze.EntityQuery.from("Projects") 
     .using(manager).execute()...then/fail. 
} 

Teraz chcę, aby była to reakcja na użytkowników, którzy edytują te same elementy za pomocą signalR. Oznacza to, że w tym momencie wywoływane są wywołania zwrotne po zakończeniu javascript mówiące, że obiekt z guid = xxxxxxx się zmienił (klucz to guid).

W jaki sposób mogę użyć Breeze, aby zaktualizować element bez ponownego wysyłania zapytania do serwera, ani nie widzi go jako aktualizacji, która musi zostać wysłana z powrotem na serwer. Remmeber, że właśnie dostałem aktualizację z sygnału r.

Czy w pierwszej kolejności podjąłem inną ścieżkę, czy istnieje powód, aby utworzyć WebApi, jeśli mógłbym tylko zwrócić dane z koncentratora signalR na początku? Czy byłoby łatwiej ustawić to za pomocą Breeze zamiast WebApi?

Odpowiedz

12

W IdeaBlade oczekujemy wskazówek dotyczących aplikacji Breeze współpracujących z SignalR.

Mój obecny jest myślenie, że SignalR jest odpowiedni dla powiadamiania klienta o zmianach danych będących przedmiotem zainteresowania, ale nie wyda zmienionych danych do klienta z SignalR. Pozwoliłem klientowi zdecydować, czy (lub nie ... lub kiedy) uzyskać zmienione dane z serwera.

Moje uzasadnienie opiera się na założeniu, że SignalR powinien być szybkim, lekkim mechanizmem powiadamiania, a nie wężem strażackim rozpylającym ogromne ilości danych u subskrybujących klientów, którzy mogą, ale nie muszą być gotowi (lub chętni) poradzić sobie z ogromna ilość danych dotyczących zmian wymuszona na nich.

Być może możesz wyjaśnić, dlaczego myślisz inaczej. Jestem z pewnością otwarty na alternatywną perspektywę.

+0

Po pierwsze, byłaby to prostota i szybki rozwój. Wystarczy podłączyć go od sygnalizatora, aby przesłać dane.Ale masz całkowitą rację, że może lepiej pozwolić klientowi zdecydować, kiedy uzyskać rzeczywiste dane. Pomyślę o tym trochę więcej i jeśli zmienię zdanie, że mój pierwszy pomysł jest lepszy niż twój, to dam ci znać :) –

+0

Muszę powiedzieć, że wraz z rozwojem CQRS ten widok nie jest jedynym poprawnym poglądem. Jeśli wydaję polecenia do mojego serwera, który ostatecznie wysyła mi zdarzenia/lub pełne modele odczytu, to signalr jest doskonałym asynchronicznym mechanizmem zdarzeń i dostarczania obiektów. – Damian

+0

W rzeczywistości byłaby to świetna funkcja z tego samego powodu, co zmiany na bryzy - minimalizowanie liczby roudripów na serwerze. Jeśli korzystasz tylko z sygnalizatorów do powiadomień (co też nie jest darmowe), nadal musisz pobrać wszystkie zmienione obiekty, których twój klient jest zainteresowany, za pośrednictwem api/odata w Internecie, a w nietrywialnych przypadkach będzie to wymagać kilku żądań lub dedykowanej metody pobierania zmiany w jednym przejściu, które z kolei nie mogą być elastyczne/ogólne. Chodzi mi o to, że byłoby miło mieć sposób na (opcjonalne) rozpowszechnianie zestawów zmian nie tylko na serwerze, ale również na subskrybowanych klientach. –

4

I całkowicie zgadzam się z Ward Bell

Jeśli zastanawiasz się, jak to zrobić: na przykład w kątowym aplikacji, można zapisać się wiatr mechanizm śledzenia podmiot jak ten

enter image description here

Następnie możesz skonfigurować Hub SignlarR w innym miejscu, aby przesłać te zmiany wszystkim klientom.

Jakkolwiek to możliwe, dzięki mocy bree ze.js, Nie polecałbym tego, ponieważ jak Ward zwrócił uwagę: "to będzie wąż ognisty natryskujący ogromne ilości danych u subskrybujących klientów". Pomyśl przez chwilę i zastanów się, czy Twoja aplikacja będzie miała hmmm, powiedzmy, że 30 równoczesnych użytkowników robi transakcje, wyobraź sobie cały ruch sieciowy, który będzie tworzył. To będzie zła architektura oprogramowania.

Jedynym powodem, dla którego możesz to zrobić, jest aktualizacja tablicy rozdzielczej, która jest pobierana z bieżących danych, ale nadal musisz być bardziej ostrożny, świadomy, świadomy ruchu danych i wykorzystania serwera.

function setupEventForHasChangesChanged() { 
     EntityManager.hasChangesChanged.subscribe(function (eventArgs) { 
      $rootScope.$emit('dataservice.hasChangesChanged', eventArgs); 
     }); 
    } 

    function setupEventForEntitiesChanged() { 
     EntityManager.entityChanged.subscribe(function (changeArgs) { 
      if (changeArgs.entityAction === breeze.EntityAction.PropertyChange) { 
       $rootScope.$emit('dataservice.entitiesChanged', changeArgs); 
      } 
     }); 
    } 
+2

Nie publikuj zrzutów ekranu z kodem. Opublikuj kod jako tekst. –