2012-12-04 33 views
0

我有一個套接字通信子系統,SocketContext門面,在類庫中唯一的公共類。 SocketContext允許您連接到遠程終端,發送和接收消息。將物業拉到門面

問題如下:比如說SocketContext消費者想監視發送的消息隊列(發送進程是異步的)。

好了,我們需要添加int QueueSize {get;}財產SocketContext,但接下來發生的事情是,我們要找到誰知道隊列的大小,這是一個DataSocketSocketContext是不知道的,所以這個屬性拉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; }} 
} 

我在做什麼錯了?

回答

0

SocketContext立面,在圖書館唯一的公共類。

我會說這可能是第一個問題之一。如果只有一個公共組件,那麼暴露功能非常困難。這也失敗了像單一責任,開放/封閉設計和界面隔離等概念。你基本上有1個對象在做一切事情。

可能有一個接入點,如SocketContextFacade,但這就是您輸入API的方式,它可以暴露客戶端可以與之交互的其他對象/組件。

我使用的很多第三方庫通常對它們有2個方面。

  1. 配置
  2. 運行

配置發生一次,在啓動時。它告訴圖書館如何爲您的特定需求而行動。運行時在整個系統中使用,根據配置運行。下面是一些例子:

  1. 實體框架/ NHibernate的
    1. 配置 - DB映射
    2. 運行 - 會議/的DbContext
  2. 流利驗證
    1. 配置 - 驗證規則
    2. 運行時 - 驗證引擎和驗證對象的結果
  3. 服務總線
    1. 配置 - 終點路由,隊列管理,錯誤處理
    2. 運行 - 消息處理程序
+0

嗯,我設計的時候在想EF,我的上下文意思就像'DbContext'。 典型的用法是:'var context = new SocketContext(ip,port);''context.Subscribe(messageId,messageHandler);''context.Send(message);'。 我不明白如何製作更多的公開課有助於:( – Anri

+0

只是公開它不會幫助,但如果它是公開的,它可以暴露給客戶端,'SocketContext'可能暴露'DataSocket'或'Connection對象本身,而不是套接字或連接的屬性 –

+0

事情是 - 類是在一個責任鏈中,只有相鄰的類彼此知道,如果我做'IDataSocket _dataSocket;''IConnection _connection;'和' ISocketClient _client;'public它可以讓消費者訪問像這樣的'context.Client.Connection.DataSocket.QueueSize'''這個很好,我猜 – Anri