3

Web サーバーと通信し、そこからデータを世界中に公開するライブラリを作成したいと考えています。Web サーバーは特別なものではなく、いくつかの REST メソッド (主に GET と POST) を公開します。

私は Reactive Extensions に比較的慣れていないので (しかし、既に気に入っています)、アドバイスをお願いします。ライブラリのインターフェイスが IObservables を公開することにしました。しかし、これを正確に実装する方法がわかりません。私はいくつかのオプションがあると考えています:

1) 公開しIObservable<IEnumerable<T>>ます。当然のことながら、REST サービスは要求されたすべてのデータを一度に返します。ユーザーが Subscribe() を呼び出し、IEnumerable が 1 つだけプッシュされ、OnDone が呼び出されます。そのため、Subscribe() を複数回呼び出す必要があります。

2) 公開しIObservable<T>ます。場合によっては良い選択かもしれません。Subscribe() は 1 回だけ呼び出され、他のデータを取得するために、メソッド Refresh() または NextPage() (...) があり、ストリームにさらにデータを取得します。IObservable<T> GetResource...(その場合、プロパティの代わりに、IObservable<T> Resource { get; }

3)Rxを忘れて、イベントを介して昔ながらの方法で実行します(最悪の場合IMO)

4) 他の方法は?

この分野で経験のある人はいますか?私が懸念しているのは、更新 (新しいデータの要求)、ページング、結果の結合、および一般的に保守しやすい設計です。

アドバイスがあればthx

4

2 に答える 2

2

次のインターフェイスを使用することをお勧めします。

public interface IRestService
{
    IObservable<T> GetResources<T>();
}

この選択の背後にはいくつかの理由があります。

IObservable<IEnumerable<T>>混合反応とインタラクティブ(またはオブザーバブルと列挙可能)を公開し、クエリを強制的に呼び出す.ToObservable()か、さらに悪いことに.ToEnumerable()、基本的なSelectManyクエリを作成します。クエリとサブスクライブコードをクリーンに保つ方がよいでしょう。

ここで、サブスクライブは1回だけで、ストリームにさらにデータを取得するにはまたは呼び出しIObservable<T>が必要になることを提案しました。それは良い考えではありません。代わりに、単一のサブスクリプションが単一のREST呼び出しのすべての結果を返し、次にを呼び出すことを考える必要があります。新しいREST呼び出しを呼び出したい場合は、再度サブスクライブしてください。RefreshNextPageOnComplete

さらに、単一のサブスクリプション呼び出しのセマンティクスは、コードで明確に表現されていません。したがって、コードの保守について考える必要があります。将来、コードを見るとき、セマンティクスは何だと思いますか?単一のサブスクリプションのセマンティクスが単一のREST呼び出しにマップされる可能性が高いことをお勧めします。そうしないと、コードがさらに混乱する可能性があります。

さらに、単一のサブスクリプションモデルは避ける必要があります。例外がスローされると、監視が実行され、もちろん、Webサービスの呼び出しでエラーが発生しやすくなる可能性があるためです。複数のサブスクリプションモデルでエラーが発生した場合は、より簡単に回復できます。

IObservable<T> Resources { get; }また、ある種の「固定」値を示唆しているため、回避します。代わりに、より動的です。つまり、呼び出しごとに異なる値が得られる可能性があります。プロパティGetResourcesよりもメソッドを呼び出す方が適切です。Resources

結論IObservable<T>として、基礎となるRESTサービスへの単一の呼び出しを抽象化するものがあります。

于 2012-08-14T01:38:30.520 に答える
0

ここでは、実際には個別に対処する必要がある 2 つの懸念事項を組み合わせています。

1 つ目は、コードが他のソースからデータを取得することです。2 つ目は、新しいデータが利用可能になったときに、そのデータを関係者に公開することです。

最初のものに関しては、Reactive Extensionsは役に立ちません。ここでの関心事は、一定の間隔でデータを取得することです。コード内で REST サービスを呼び出す場合、コールバックがなく、サービスが呼び出すことができるものにフックするものがないため、時間間隔を設定する必要があります。

外部サービスからコードに何らかのコールバックがあった場合、それを何らかのIObservable<T>実装にラップして、サブスクライブして操作を実行できます (実際には、サブスクリプションを転送するだけです)。

最初の問題に対して Reactive Extensions を使用できる唯一の方法は、クラスの静的Timerメソッドを使用してタイマーを設定することです。Observable

2 番目の懸念 (データを取得し、サブスクライバーに通知したい後)については、実装を使用してサブスクライバーに通知することは絶対に可能であり、使用する必要があります。IObservable<T>

この場合、インターフェイスのメソッドの意図から逸脱しようとしないことを強く勧めします。誰でもサブスクライブできるを提供するメソッドを公開し (が呼び出される前に がホットかコールドかは自由です)、 への呼び出しから返されたインターフェイス実装でメソッドを呼び出してサブスクライブを解除する必要があります。SubscribeIObservable<T>IObservable<T>IObservable<T>SubscribeDisposeIDisposableSubscribe

そうすれば、クライアントは を取得しIObservable<T>、必要な通知をサブスクライブし、完了したらサブスクライブを解除できます。

于 2012-08-13T17:35:23.160 に答える