2012-04-20 7 views
0

私は一部のクライアントにサービスを提供するWCFサービスを持っています。 デザインは、次のとおりです。ワーカースレッドを使用したWCFサービス - どのように設計するのですか?

  • WCFサービス層
  • ビジネスロジック層
  • データアクセス層(LINQツーエンティティ)

私はいくつかの連続を行うワーカースレッドを持っている必要がありますデータベース上での作業(新しいレコードを探し、見つかった場合は、クライアントに「プッシュ」方式で情報を送信します。つまり、クライアントはこのワーカースレッドから「プッシュ」通知を受け取れるようにサービスをホストします)。

WindowsサービスでWCFサービスをホストします。

質問:私はこのワーカースレッドを自分のデザインにどこに収めるのですか? WCFサービスの横にあるWindowsサービスの 'Program.cs'の 'Main()'に生成する必要がありますか? (これはWCFサービスアセンブリの一部でなければならないことを意味します) それはビジネスロジックレイヤの一部であるべきですか、それともビジネスロジックアセンブリの一部ですか?私が念頭に置いていた何

enter image description here

+0

あなたは、「クライアントがサービスをホストします」によって何を意味するのか明確にすることはできますか?あなたは、WCFサービスがすべてのクライアントについて知っていなければならないと言っていますか?プッシュは必須条件ですか?あなたはクライアントをコントロールしていますか? –

+0

私は一番上のレイヤーにそれをスポーンするので、Main()の内側にある – Chandermani

+0

'Push'が必要です。クライアントがサーバーに接続すると、エンドポイント構成のサーバーを通過し、サーバーはクライアントとしてクライアントにも接続します。そうすれば、サーバはクライアントに情報をプッシュすることができます(コールバックのサポートは私には良いことではありません)... –

答えて

0

は、なぜそれがいずれかのアセンブリの一部である必要はありませんか?私は、このワーカースレッドをそれ自身のプロセス全体にホストします。たとえば、それを別のWindowsサービスでホストします。

これで、データベースをポーリングしてデータをクライアントにプッシュできます。一緒に

UPDATE

あなたのデザインのカップルを操作する三つの異なる種類。まず、データベースの読み取り操作があります。次に、データベース更新操作があります。次に、データベースの通知(またはイベント)があります。

これらの異なるタイプの動作要件のそれぞれは、互いに切り離されている必要があります。これにより、アーキテクチャ全体の維持と理解が容易になります。

たとえば、読み取り操作をデカップリングすることで、サービスインターフェイスを使用するかどうかを決めることができます。 ADOを使用してクライアントがデータベースに直接接続して選択操作を実行できるようにすることは可能でしょうか?

サービスを使用するかどうかに関わらず、更新操作はオフラインにする必要があります。読み書き操作を結合する正当な理由はありません。これにより、データベースの競合の可能性を減らすことができ、すべてを簡単に保ちます。クライアントは、非同期更新コマンドを更新キューに送信し、更新サービスがデータベースを更新します。

これは私が考えているものの一種である:

enter image description here

+0

これは私が念頭に置いたアイデアのイメージです: "私が何を持っていたか"](http://s18.postimage.org/5o9bwg13r/Design_Idea.png)。このワーカースレッドは、どのクライアントがWCFサービスに接続されているかを知る必要があるため、それらのクライアントに接続してPUSHメッセージを送信できます(各クライアントは独自のWCFサービスもホストします)。このように、ワーカースレッドは独自のDALを作成する代わりに、WCFサービスのデータアクセスレイヤーも使用できます。これは間違っていますか? –

+0

なぜ、クライアントエンドポイントのリストをデータベースに保持しないのですか?さらに、各クライアントがデータプッシュサービスからの更新を購読するようにしてください。 –

+0

アップデート –

関連する問題