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; }}
}

我究竟做错了什么?

4

1 回答 1

0

SocketContext门面,类库中唯一的公共类。

我会说这可能是第一个问题。如果只有 1 个公共组件,则很难公开功能。这也使单一职责、开放/封闭设计和接口隔离等概念失效。你基本上有 1 个对象在做所有事情。

可能有一个像SocketContextFacade.

我使用的很多第三方库通常有两个方面。

  1. 配置
  2. 运行

配置发生一次,在启动时。它告诉库如何满足您的特定需求。运行时在整个系统中使用,根据配置运行。这里有些例子:

  1. 实体框架/休眠
    1. 配置 - 数据库映射
    2. 运行时 - 会话/dbcontext
  2. 流畅的验证
    1. 配置 - 验证规则
    2. 运行时 - 验证引擎和验证对象的结果
  3. 服务巴士
    1. 配置 - 端点路由、队列管理、错误处理
    2. 运行时 - 消息处理程序
于 2012-12-04T16:22:34.657 回答