2013-04-16 27 views
8

Tôi có một dự án mà bây giờ tôi đã thiết lập với BreezeJS. Không biết những gì xảy ra bên trong BreezeJS với phạm vi đầy đủ, nhưng chỉ chấp nhận rằng nó hoạt động, tôi có các mục của tôi hiển thị trên màn hình cơ bản từ lệnh đơn giản này.SignalR kết hợp với Breeze

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

Bây giờ tôi muốn làm cho nó đáp ứng với người dùng chỉnh sửa cùng một mục với signalR. Điều này có nghĩa là tôi tại thời điểm này có callbacks được bắn vào cuối javascript nói rằng đối tượng với guid = xxxxxxx đã thay đổi (guid là chìa khóa).

Làm cách nào tôi có thể nhấn vào Breeze cập nhật mục mà không cần truy vấn lại máy chủ, cũng không xem nó như là bản cập nhật cần được gửi lại cho máy chủ. Remmeber rằng tôi chỉ nhận được cập nhật từ tín hiệu r.

Nếu tôi đã thực hiện một con đường khác ở nơi đầu tiên, có lý do nào để tạo WebApi nếu tôi chỉ có thể trả lại dữ liệu từ trung tâm signalR lúc đầu không? Nó sẽ được dễ dàng để thiết lập này với Breeze thay vì WebApi?

Trả lời

12

Hiện tại IdeaBlade đang hướng tới việc cung cấp hướng dẫn tốt về các ứng dụng Breeze hoạt động với SignalR.

suy nghĩ hiện tại của tôi là SignalR là thích hợp cho thông báo cho khách hàng về thay đổi dữ liệu quan tâm nhưng tôi sẽ không cung cấp dữ liệu thay đổi cho khách hàng với SignalR. Tôi cho phép khách hàng quyết định liệu (hoặc không ... hoặc khi nào) để lấy dữ liệu đã thay đổi từ máy chủ.

Lý do của tôi dựa trên quan điểm cho rằng SignalR phải là cơ chế thông báo nhanh, nhẹ, không phải là ống cứu hỏa phun số lượng lớn dữ liệu tại các khách hàng đăng ký có thể hoặc không sẵn sàng (hoặc sẵn sàng) để đối phó với khối lượng lớn dữ liệu thay đổi đã buộc họ.

Có lẽ bạn có thể giải thích lý do tại sao bạn nghĩ khác. Tôi chắc chắn mở ra một quan điểm thay thế.

+0

Thứ nhất, nó sẽ đơn giản và phát triển nhanh chóng. Chỉ cần móc nó lên từ signalr để đẩy dữ liệu.Nhưng bạn hoàn toàn đúng, rằng nó có thể tốt hơn để cho khách hàng quyết định khi nào nhận được dữ liệu thực tế. Tôi sẽ nghĩ nhiều hơn một chút về nó và nếu tôi thay đổi ý nghĩ rằng ý tưởng đầu tiên của tôi tốt hơn bạn thì tôi sẽ cho bạn biết :) –

+0

Tôi phải nói với sự gia tăng của CQRS quan điểm này không phải là quan điểm đúng đắn. Nếu tôi đang nhận được lệnh để máy chủ của tôi mà cuối cùng gửi cho tôi sự kiện/hoặc mô hình đọc đầy đủ thì signalr là một sự kiện async lớn và cơ chế phân phối đối tượng. – Damian

+0

Trên thực tế đây sẽ là một tính năng tuyệt vời cho cùng một lý do thay đổi gió là - giảm thiểu số lượng roudrips cho máy chủ. Nếu bạn chỉ sử dụng tín hiệu cho các thông báo (không miễn phí), bạn vẫn cần tìm nạp tất cả các đối tượng đã thay đổi mà khách hàng quan tâm thông qua api/odata trên web và trong các trường hợp không cần thiết. những thay đổi trong một lần lượt mà không thể linh hoạt/chung chung. quan điểm của tôi là - nó sẽ được tốt đẹp để có một cách để (tùy chọn) tuyên truyền changesets không chỉ cho máy chủ, nhưng cho khách hàng đăng ký là tốt. –

4

Tôi hoàn toàn đồng ý với Phường Chuông

Nếu bạn tự hỏi làm thế nào để làm điều đó: ví dụ như trong một ứng dụng góc, bạn có thể đăng ký để khoe cơ chế theo dõi thực thể như thế này

enter image description here

Sau đó, bạn có thể thiết lập Trung tâm Đăng ký ở một nơi khác để chuyển những thay đổi đó cho tất cả khách hàng

Tuy nhiên, có thể nhờ sức mạnh của bree ze.js, Tôi không khuyến khích nó, bởi vì như Ward đã chỉ ra: “đó sẽ là một vòi cứu hỏa phun lượng lớn dữ liệu tại các khách hàng đăng ký”. Chỉ cần suy nghĩ một lúc và xem xét ứng dụng của bạn sẽ có hmmm giả sử 30 người dùng đồng thời thực hiện giao dịch, hãy tưởng tượng tất cả lưu lượng truy cập Mạng sẽ tạo. Đó sẽ là kiến ​​trúc phần mềm xấu.

Lý do duy nhất bạn có thể xem xét việc này là nếu bạn cần cập nhật trang tổng quan cung cấp dữ liệu trực tiếp, nhưng bạn vẫn cần phải phối hợp thêm, lưu tâm, nhận thức, nhận thức lưu lượng dữ liệu và sử dụng máy chủ.

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

Không đăng ảnh chụp màn hình của mã. Đăng mã dưới dạng văn bản. –

Các vấn đề liên quan