2009-07-24 23 views
8

Các khung IObservable/IObserver mới trong thư viện System.Reactive có trong .NET 4.0 rất thú vị (xem this và liên kết this).Có những bổ sung giống như IQueryable cho IObservable được không? (.NET Rx)

Có thể còn quá sớm để suy đoán, nhưng cũng sẽ có một (vì thiếu một thuật ngữ tốt hơn) Khung tương tự như IQueryable được xây dựng cho các giao diện mới này?

Một trường hợp sử dụng cụ thể sẽ hỗ trợ các sự kiện trước khi xử lý tại nguồn, thay vì trong chuỗi cuộc gọi nhận. Ví dụ, nếu bạn có một giao diện sự kiện rất 'chatty', sử dụng Subscribe().Where(...) sẽ nhận được tất cả các sự kiện thông qua các đường ống và khách hàng thực hiện việc lọc.

Điều tôi đang tự hỏi là sẽ có điều gì đó giống với IQueryableObservable, theo đó các phương pháp LINQ này sẽ được 'biên dịch' thành một số thực thi 'thông minh' Subscribe trong nguồn. Tôi có thể tưởng tượng một số kiến ​​trúc máy chủ mạng nhất định có thể sử dụng một khung công tác như vậy. Hoặc làm thế nào về một add-on cho SQL Server (hoặc bất kỳ RDBMS cho rằng vấn đề) mà sẽ cho phép mã NET để nhận được thông báo dữ liệu mới (gây nên trong mã) và sẽ cần những thông báo lọc phía máy chủ.

Trả lời

8

Vâng, bạn đã có trong bản phát hành mới nhất của Rx, dưới dạng giao diện được gọi là IQbservable (được phát âm là IQueryableObservable). Hãy tiếp tục theo dõi video về Kênh 9 về chủ đề này, sẽ xuất hiện vào đầu tuần tới.

Để đặt vị trí tính năng này một chút, ta nên nhận ra có những khái niệm ba trục vuông góc với câu đố Rx/Ix:

  • mô hình dữ liệu là bạn đang nhắm mục tiêu. Ở đây chúng ta tìm thấy các mô hình dựa trên pull dựa trên các mô hình push. Mối quan hệ của họ dựa trên tính hai mặt nhị phân. Biến đổi tồn tại giữa những thế giới đó (ví dụ: ToEnumerable).
  • Trong đó bạn thực hiện các hoạt động thúc đẩy truy vấn của bạn (sensu lato). Một số nhà khai thác cần đồng thời. Đây là nơi lập lịch biểu và giao diện IScheduler. Các toán tử tồn tại để nhảy giữa các tên miền đồng thời (ví dụ: ObserveOn).
  • Cách hiển thị biểu thức truy vấn. Hoặc là nguyên văn (IL) hoặc có thể dịch (cây biểu thức). Mối quan hệ của họ dựa trên tính đồng tính. Chuyển đổi tồn tại giữa hai biểu diễn (ví dụ: AsQueryable).

Tất cả giao diện IQbservable (là biểu thức kép cho IQueryable và biểu thức cây biểu thức của truy vấn IObservable) cho phép là điểm cuối cùng. Đôi khi mọi người nhầm lẫn với hành động dịch truy vấn ("cách" để chạy) với các khía cạnh từ xa ("nơi" để chạy). Thông thường, bạn thực hiện dịch truy vấn vào một số ngôn ngữ đích (như WQL, PowerShell, DSQL cho dịch vụ thông báo trên đám mây, v.v.) và từ xa chúng vào một số hệ thống đích, cả hai mối quan tâm đều có thể được tách riêng. Ví dụ: bạn có thể sử dụng biểu thức cây biểu thức để thực hiện địa phương tối ưu hóa truy vấn.

Liên quan đến các vấn đề bảo mật có thể xảy ra, điều này không khác với khả năng IQueryable. Thông thường, người ta sẽ chỉ từ xa ngôn ngữ biểu thức chứ không phải bất kỳ toán tử "thực sự có tác dụng phụ" nào (bất kể điều gì có nghĩa là đối với các ngôn ngữ khác với ngôn ngữ chính thống). Đặc biệt, các hoạt động Đăng ký và Chạy ở lại địa phương và đưa bạn ra khỏi đơn nguyên có thể truy vấn (do đó kích hoạt dịch, giống như GetEnumerator thực hiện trong thế giới của IQueryable). Làm thế nào bạn muốn từ xa hành động đăng ký là một cái gì đó tôi sẽ để lại cho trí tưởng tượng của người đọc.

Bắt đầu chơi với latest bits hôm nay và cho chúng tôi biết suy nghĩ của bạn. Đồng thời, hãy tiếp tục theo dõi video sắp tới của Kênh 9 về tính năng mới này, bao gồm một cuộc thảo luận về một số triết lý thiết kế của kênh.

+1

Xem video của Bart trên Kênh 9 thảo luận về IQObservable: http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Observations-on-IQbservable-The-Dual-of-IQueryable –

3

Trong khi điều này nghe giống như một khả năng thú vị, tôi sẽ có một số đặt phòng về việc thực hiện điều này.

1) Cũng giống như bạn không thể tuần tự hóa các biểu thức lambda không tầm thường được sử dụng bởi IQueryable, việc tuần tự hóa các biểu thức này cho Rx sẽ rất khó. Bạn có thể muốn có thể tuần tự hóa các dòng lambdas đa dòng và tuyên bố như là một phần của khuôn khổ này. Để làm điều đó, bạn có thể sẽ cần phải thực hiện một cái gì đó giống như các dự án thú cưng khác của Erik Meijer - Dryad và Volta.

2) Ngay cả khi bạn có thể tuần tự hóa các biểu thức lambda này, tôi sẽ lo ngại về khả năng chạy mã tùy ý trên máy chủ được gửi từ máy khách. Điều này có thể dễ dàng đặt ra một mối quan tâm bảo mật lớn hơn nhiều so với kịch bản cross-site. Tôi nghi ngờ rằng lợi ích tiềm năng của việc cho phép khách hàng gửi các biểu thức tới máy chủ để thực thi lớn hơn các tác động của lỗ hổng bảo mật.

+0

Hi Jim, những kẻ Rxx đã đưa ra một nhà cung cấp TCP IQbservable, trong đó có những vấn đề an ninh ... nhưng họ có thể serialize tất cả mọi thứ ngoại trừ các biểu thức động và gỡ lỗi ... các công cụ tốt, ngoại trừ phần bảo mật ... :) vẫn còn, đó là một alhpa. :) –

0

Một vấn đề tôi rất muốn được giải quyết với Khung phản ứng, nếu có thể, sẽ cho phép phát xạ và đăng ký thay đổi thông báo cho dữ liệu đã lưu trong bộ nhớ cache từ dịch vụ web và các dịch vụ kéo khác.

0

Nó xuất hiện, dựa trên một channel9 mới interview, rằng sẽ có LINQ hỗ trợ cho IObserver/IObservable trong BCL của .NET 4.

Tuy nhiên nó về cơ bản sẽ được truy vấn phong cách LINQ-to-Đối tượng, vì vậy ở giai đoạn này, nó không giống như một 'đăng ký thông minh' khi bạn đặt nó. Đó là như xa như việc triển khai cơ bản đi vào NET 4. (Từ hiểu biết của tôi từ cuộc phỏng vấn trên)

Có nói rằng, khuôn khổ phản ứng (Rx) có thể có triển khai chi tiết hơn về IObserver/IObservable, hoặc bạn có thể viết thông tin riêng của bạn theo số Expression<Func...> cho thông số Subscribe và sau đó sử dụng Cây biểu thức của Func để đăng ký theo cách thông minh hơn phù hợp với kênh sự kiện bạn đang đăng ký.

1

8 năm trong tương lai: tôi stumbled trên Qactive (cựu Rxx), một Rx.Net dựa queryable tcp phản ứng cung cấp dịch vụ máy chủ Đó là câu trả lời cho "Câu hỏi trong câu hỏi"

server

Observable 
    .Interval(TimeSpan.FromSeconds(1)) 
    .ServeQbservableTcp(new IPEndPoint(IPAddress.Loopback, 3205)); 

khách hàng

var datasourceAddress = new IPEndPoint(IPAddress.Loopback, 3205); 
var datasource = new TcpQbservableClient<long>(datasourceAddress); 

(
    from value in datasource.Query() 
    //The code below is actually executed on the server 
    where value <= 5 || value >= 8 
    select value 
) 
.Subscribe(Console.WriteLine); 

Tâm trí của bạn là gì khi khách hàng có thể nói những gì và tần suất họ muốn dữ liệu họ nhận được và máy chủ vẫn có thể giới hạn và kiểm soát thời gian, mức độ thường xuyên và số lượng dữ liệu trả về.

Đối với thông tin thêm về điều này https://github.com/RxDave/Qactive

blog.sample Một

https://sachabarbs.wordpress.com/2016/12/23/rx-over-the-wire/

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