0

SocketContextクラスライブラリで唯一のパブリッククラスであるファサードからアクセスできるソケット通信サブシステムがあります。SocketContextリモートエンドポンドに接続し、メッセージを送受信できます。

問題は次のとおりです。SocketContext消費者が送信済みメッセージキューを監視したいとします(送信プロセスは非同期です)。

さて、int QueueSize {get;}プロパティを追加する必要がありますSocketContextが、次に何が起こるかは、キューサイズを認識している人を見つけ、それは認識していないDataSocketクラスであるSocketContextため、そのプロパティをプルするには、SocketContextこのように複数回ラップする必要があります:

// DataSocket -> Connection -> SocketClient -> SocketContext

internal class DataSocket
{ 
  public int QueueSize { get{ /* calculating and returning actual value */ }}
}

internal class Connection
{
   IDataSocket _dataSocket;
   int QueueSize { get{ return _dataSocket.QueueSize; }}
}

internal class SocketClient
{
   IConnection _connection;
   int QueueSize { get{ return _connection.QueueSize; }}
}

public class SocketContext
{
   ISocketClient _client;
   int QueueSize { get{ return _client.QueueSize; }}
}

私は何が間違っているのですか?

4

1 に答える 1

0

SocketContextファサード、クラスライブラリで唯一のパブリッククラス。

これが最初の問題の1つになると思います。パブリックコンポーネントが1つしかない場合、機能を公開することは非常に困難になります。これは、単一責任、オープン/クローズド設計、インターフェイス分離などの概念にも失敗します。基本的に、1つのオブジェクトがすべてを実行します。

のような単一のアクセスポイントが存在する場合がありますがSocketContextFacade、それがAPIに入る方法であり、クライアントが対話できる他のオブジェクト/コンポーネントを公開できます。

私が使用するサードパーティのライブラリの多くには、通常2つの側面があります。

  1. 構成
  2. ランタイム

構成は、起動時に1回行われます。それはあなたの特定のニーズのためにどのように振る舞うかを図書館に教えます。ランタイムはシステム全体で使用され、構成に従って動作します。ここではいくつかの例を示します。

  1. Entity Framework / Nhibernate
    1. 構成-DBマッピング
    2. ランタイム-セッション/dbcontext
  2. 流暢な検証
    1. 構成-検証ルール
    2. ランタイム-検証エンジンとオブジェクトの検証結果
  3. サービスバス
    1. 構成-エンドポイントルーティング、キュー管理、エラー処理
    2. ランタイム-メッセージハンドラ
于 2012-12-04T16:22:34.657 に答える