1

他のエリアがサインアップして「サービス」を提供し、リクエストを渡すことができるServiceManagerエリア(ファサードインターフェイスを持つクラスのセット)の作成を検討しています。このクラスを独自のスレッドで実行する予定であり、重要な領域を最小限に抑え、純粋にこの領域内で処理したいと考えています。

エリアがサインアップすると、ServiceRequests のリストであるコマンドの受信ボックスと送信ボックスを取得します。

ここで私のジレンマは、送信ボックス (サービス プロバイダー エリア) へのリンクを共有しない場合、一致するものを検索してボックスを見つける必要があることです (すべてのサインアップで重要な領域であり、これにより、すべての要求が次のように送信されます)。まあ、ローカルの送信トレイの目的を無効にします)。

別の方法として、ServiceManager 領域の外側にリンクを張ると、新しい外部領域がコーディングされます。重要な領域をスキップして、これをバイパスしてリストを直接更新することができます。


私の解決策は、ServiceManager 領域のコード内で、直接アクセスが領域を離れることのない「キー」オブジェクトを作成することです (完全な空を含む任意のオブジェクトが機能します)。

エリアがサインアップされると、代わりにクラスが返されます。ここには、上記のオブジェクトへのリンクと、サインアップされたエリアの ServiceManager オブジェクトへのリンクがあります。(他の情報とともに直接の受信箱/送信箱のリンクが含まれています)。

この「トークン」オブジェクトには、次のコードも含まれています

public ServiceObject GetServiceObject(Key key)
{
    If (key == this.key)
    {
        return serviceObject;
    }
    return null
{

このように、コマンドが公開されている場合でも、そのコンテンツは、Key オブジェクトに直接アクセスできる唯一の領域であるため、ServiceManager 領域内でのみアクセスできます。これにより、すべてのサービス ユーザー間で重要な領域を共有するという上記の 2 つの懸念と、これらのサービス ユーザーが自分のリストに直接アクセスするリスクが回避されます。

それで問題は解決しますが、私にはこれは本当に醜いように見えます。よりスマートなアプローチはありますか?

4

2 に答える 2

0

私が現在使用しているコードはこれです。

//base class of no use on its own. Used to lock the AreaIdentifier
public class Key
{
    public Key()
    {
    }
}

//public direct link to ServiceArea info, without ability to access it without the internal key
public class AreaIdentifier
{
    Key key;
    ServiceArea serviceArea;
    public AreaIdentifier(ServiceArea serviceArea, Key key)
    {
        this.key = key;
        this.serviceArea = serviceArea;
    }

    public ServiceArea GetServiceArea(Key key)
    {
        if (this.key == key) return serviceArea;
        return null;
    }
}

}

このアプローチの理由は、「トランスポート層」の「内部コード」と追加と削除がアクションを台無しにしない方法で外部領域をコーディングする必要があるためです。直接リンクを共有すると

そのため、外側の領域 (独自のスレッド内) が新しいコマンドを追加したい場合、通信層コード内に配置された次の呼び出しを呼び出すことによってそれを行います。(この領域内にはプライベート キー変数があり、AreaIdentifier を介してアクセスすることはできませんが (ただし、既知です)、領域外で他の方法で共有することもできません。

    //Put a command in the outBox for pickup by CommunicationLayer
    public Boolean AddCommand(AreaIdentifier area, CommandRequest command)
    {
         //attempt enter critical region or return false;             
         ServiceArea temparea = area.GetServiceArea(key);
         List<Command> tempOutbox = temparea.GetOutBox();
         tempOutbox.Add(command);
         //exit critical region
         return true;
    }

このアプローチから私が見る唯一の欠点は、TransportLayerの「内部」関数の外ではほとんど意味をなさない「GetServiceArea」のパブリック関数があることです

于 2013-04-29T14:15:27.043 に答える