Наблюдается из метода обратного вызова

Допустим, у меня есть класс, который наследует устаревший API и переопределяет виртуальный метод, который вызывается, когда что-то происходит.

type MyClass() as this =
    let somethingObservable: IObservable<Something> = ...

    override _.OnSomething(s: Something) = ...

Как я могу перевести каждый вызов OnSomething в уведомление о somethingObservable?

Вероятно, это простой вопрос, но я не смог найти способ сделать это правильно (должен ли я использовать не рекомендованный ISubject?). Ценю вашу помощь.


person irriss    schedule 13.06.2020    source источник


Ответы (1)


Использование такой темы прекрасно и обеспечивает правильность реализации. Вот пример использования FSharp.Control.Reactive, который дает вам идиоматический способ написания этого.

type MyClass() =
    inherit Legacy()
    let somethingObservable = 
        Subject.broadcast

    override _.OnSomething s = 
        somethingObservable |> Subject.onNext s |> ignore

    member _.AsObservable = 
        somethingObservable |> Observable.asObservable

Вы также можете использовать new Subject<_> и его методы, то же самое. В некоторых сборках, если вы предпочитаете не использовать зависимость System.Reactive, F# ​​также изначально поддерживает IObservable через события.

type MyClassEvt() =
    inherit Legacy()
    let event = new Event<_>()

    override _.OnSomething s = 
        event.Trigger s

    member _.AsObservable = 
        event.Publish :> IObservable<_>
person Asti    schedule 15.06.2020