すべてのクライアントが接続する 2 つの WCF サービスを設計しています。これらのサービスの 1 つが通知サービスです。
各クライアントがサービスに接続し、サブスクライブしてから、デュプレックス コールバック インターフェイスを使用して通知を受信するようにします (サービスはクライアントで「通知」操作を起動します)。
これは私のデザインのアイデアです:
私の質問は次のとおりです。各クライアントがサービスに接続するときに、データベースの「ユーザー」テーブルに対して検証します (UserNamePasswordValidator を使用し、「検証」関数を実装します)。
要件: 各ユーザーは、データベースで定義されたルールに基づいて異なる通知を受け取る必要がありますが、すべて同じコントラクトを使用します。
例えば:
DB 内のJohn Smithのルールは次のようになります。価格が 100 ドルを超えるすべての新製品について通知する。
Jane Doeの DB でのルールは次のようになります。すべての新製品について、名前が「JA」で始まることを通知してください。
DB 内のJim Jabraのルールは次のようになります。「食品」タイプのすべての新製品について通知する。
私のサービスには、データベースの変更 (新しい製品がデータベースに挿入された) を検出するワーカー スレッドがあります。
次に、接続されているすべてのクライアントをループする必要があります。クライアントの通知要求に一致する場合にのみ、クライアントごとに新製品の通知を送信します。
繰り返しますが、すべてのクライアントは同じ種類の更新 (新製品) を受け取りますが、データベース内のルールに従って、各クライアントは異なる製品を受け取る必要があります。
これを実装するために私が考えた1つのアプローチは、次のリストを保持するSingletonサービスを使用することです。
- クライアント エンドポイント
- ユーザー オブジェクト (データベースから)
このように - ワーカー スレッドが新しい製品を検出するたびに、このリストをループして、必要な人に通知を送信します。このアプローチの問題点は、クライアントの 1 つのグローバル リストを作成するには、サービスを Singlton として使用する必要があることです。
2 番目のアプローチは...そうですね...ワーカー スレッドからサービスに接続されているクライアントのリストにアクセスする方法について、別の考えがありません...
私が抱えている主な問題は、各クライアントがさまざまな種類の製品を通知することを望んでいる可能性があることだと思います. つまり、私のシナリオではサービスがクライアントについて知る必要があるため、pub\sub メソッドはここではあまり適していません。
この頭痛を解決する方法について何か提案はありますか?