Будут ли дополнения, подобные IQueryable, к IObservable?(.NET Rx)

StackOverflow https://stackoverflow.com/questions/1179296

  •  19-09-2019
  •  | 
  •  

Вопрос

Новые фреймворки IObservable / IObserver в системе.Реактивная библиотека, появившаяся в .NET 4.0, очень интересна (см. это и это ссылка).

Это может быть слишком рано говорить, но будет также быть (из-за отсутствия лучшего термина) Интерфейс IQueryable, как и опираются на эти новые интерфейсы, а?

Одним из конкретных вариантов использования было бы оказание помощи в предварительной обработке событий в источнике, а не в цепочке принимающих вызовов.Например, если у вас очень "разговорчивый" интерфейс мероприятия, используя Subscribe().Where(...) будет получать все события по конвейеру, и клиент выполняет фильтрацию.

Что мне интересно, так это будет ли что-то похожее на IQueryableObservable, посредством чего эти методы LINQ будут "скомпилированы" в какой-нибудь "умный" Subscribe реализация в исходном коде.Я могу представить себе определенные архитектуры сетевых серверов, которые могли бы использовать такой фреймворк.Или как насчет дополнения к SQL Server (или любой другой СУБД, если на то пошло), которое позволило бы .NET code получать уведомления о новых данных (триггеры в коде) и нуждалось бы в фильтрации этих уведомлений на стороне сервера.

Это было полезно?

Решение

Что ж, вы получили это в последней версии Rx в виде интерфейса под названием IQbservable (произносится как IQueryableObservable).Следите за новостями на канале Channel 9, чтобы увидеть видео на эту тему, которое выйдет в начале следующей недели.

Чтобы немного прояснить эту особенность, следует понимать, что концептуально в головоломке Rx/Ix есть три ортогональные оси:

  • Что модель данных, на которую вы ориентируетесь.Здесь мы видим модели, основанные на вытягивании и выталкивании.Их отношения основаны на двойственность.Между этими мирами существуют трансформации (например,ТоЭнумерабле).
  • Где вы выполняете операции, которые управляют вашими запросами (в смысле слова).Некоторым операторам необходим параллелизм.Это где планирование и появляется интерфейс IScheduler.Существуют операторы для переключения между доменами параллелизма (например,НаблюдатьВкл).
  • Как выражение запроса должно быть выполнено.Либо дословно (IL), либо переводимо (деревья выражений).Их отношения основаны на гомоиконичность.Между обоими представлениями существуют преобразования (например,AsQueryable).

Все возможности интерфейса IQbservable (который является двойником IQueryable и представлением дерева выражений запроса IObservable) — это последний пункт.Иногда люди путают процесс трансляции запроса («как» выполнять) с аспектами удаленного взаимодействия («где» выполнять).Хотя обычно вы делаете переводить запросы на какой-либо целевой язык (например, WQL, PowerShell, DSQL для служб облачных уведомлений и т. д.) и удаленный их в некоторую целевую систему, обе проблемы могут быть разделены.Например, вы можете использовать представление дерева выражений, чтобы сделать местный оптимизация запросов.

Что касается возможных проблем с безопасностью, это ничем не отличается от возможностей IQueryable.Обычно удаляется только язык выражений, а не какие-либо операторы с «действительно побочными эффектами» (что бы это ни значило для языков, отличных от фундаменталистских функциональных).В частности, операции Subscribe и Run остаются локальными и выводят вас из запрашиваемой монады (следовательно, запуская трансляцию, как это делает GetEnumerator в мире IQueryable).Я оставлю на усмотрение читателя, как вы будете удаленно оформлять подписку.

Начните играть с последние новости сегодня и дайте нам знать, что вы думаете.Также следите за обновлениями на канале Channel 9, чтобы увидеть видео об этой новой функции, включая обсуждение некоторых философий ее дизайна.

Другие советы

Хотя это звучит как интересная возможность, у меня есть несколько сомнений по поводу ее реализации.

1) Точно так же, как вы не можете сериализовать нетривиальные лямбда-выражения, используемые IQueryable, их сериализация для Rx будет столь же сложной.Вероятно, вы захотите иметь возможность сериализовать многострочные и операторные лямбда-выражения как часть этой платформы.Для этого вам, вероятно, придется реализовать что-то вроде других любимых проектов Эрика Мейера — Dryad и Volta.

2) Даже если бы вы могли сериализовать эти лямбда-выражения, меня бы беспокоила возможность запуска произвольного кода на сервере, отправленного от клиента.Это может легко создать гораздо большую проблему безопасности, чем межсайтовый скриптинг.Я сомневаюсь, что потенциальная выгода от разрешения клиенту отправлять выражения на сервер для выполнения перевешивает последствия уязвимости безопасности.

на 8 (сейчас 10) лет в будущее: Я споткнулся о Активный (бывший Rxx), a Rx.Net основанный на запросе поставщик реактивного tcp-сервера Это ответ на "вопрос в вопросе"

Сервер

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

Клиент

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);

Что в этом потрясающего, так это то, что клиенты могут указывать, какие и как часто они хотят получать данные, а сервер по-прежнему может ограничивать и контролировать, когда, с какой частотой и в каком объеме он возвращает данные.

Для получения дополнительной информации об этом https://github.com/RxDave/Qactive

Еще один блог.пример

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

Одна из проблем, которую мне хотелось бы решить с помощью Reactive Framework, если это возможно, — это включение эмиссии и подписки для изменения уведомлений для кэшированных данных из веб-служб и других служб, работающих только по запросу.

Оказывается, на основе нового канала9 интервью, что будет поддержка LINQ IObserver/IObservable в BCL .NET 4.

Однако по сути это будут запросы в стиле LINQ-to-Objects, поэтому на данном этапе это не похоже на «умную подписку», как вы выразились.Это все, что касается базовых реализаций в .NET 4.(Насколько я понял из интервью выше)

Было сказано, что, Reactive framework (Rx) может иметь более детальную реализацию IObserver/IObservable, или вы можете написать свой собственный проход Expression<Func...> для Subscribe параметры, а затем с помощью дерева выражений Func подписаться более разумным способом, который соответствует каналу событий, на который вы подписываетесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top