他のエリアがサインアップして「サービス」を提供し、リクエストを渡すことができるServiceManagerエリア(ファサードインターフェイスを持つクラスのセット)の作成を検討しています。このクラスを独自のスレッドで実行する予定であり、重要な領域を最小限に抑え、純粋にこの領域内で処理したいと考えています。
エリアがサインアップすると、ServiceRequests のリストであるコマンドの受信ボックスと送信ボックスを取得します。
ここで私のジレンマは、送信ボックス (サービス プロバイダー エリア) へのリンクを共有しない場合、一致するものを検索してボックスを見つける必要があることです (すべてのサインアップで重要な領域であり、これにより、すべての要求が次のように送信されます)。まあ、ローカルの送信トレイの目的を無効にします)。
別の方法として、ServiceManager 領域の外側にリンクを張ると、新しい外部領域がコーディングされます。重要な領域をスキップして、これをバイパスしてリストを直接更新することができます。
私の解決策は、ServiceManager 領域のコード内で、直接アクセスが領域を離れることのない「キー」オブジェクトを作成することです (完全な空を含む任意のオブジェクトが機能します)。
エリアがサインアップされると、代わりにクラスが返されます。ここには、上記のオブジェクトへのリンクと、サインアップされたエリアの ServiceManager オブジェクトへのリンクがあります。(他の情報とともに直接の受信箱/送信箱のリンクが含まれています)。
この「トークン」オブジェクトには、次のコードも含まれています
public ServiceObject GetServiceObject(Key key)
{
If (key == this.key)
{
return serviceObject;
}
return null
{
このように、コマンドが公開されている場合でも、そのコンテンツは、Key オブジェクトに直接アクセスできる唯一の領域であるため、ServiceManager 領域内でのみアクセスできます。これにより、すべてのサービス ユーザー間で重要な領域を共有するという上記の 2 つの懸念と、これらのサービス ユーザーが自分のリストに直接アクセスするリスクが回避されます。
それで問題は解決しますが、私にはこれは本当に醜いように見えます。よりスマートなアプローチはありますか?