将房产拉到Facade

时间:2012-12-04 16:05:03

标签: c# design-patterns architecture

我有一个可由SocketContext facade访问的套接字通信子系统,它是类库中唯一的公共类。 SocketContext允许您连接到远程端点,发送和接收消息。

问题如下:假设SocketContext消费者希望监视已发送的消息队列(发送过程是异步的)。

好吧,我们需要在int QueueSize {get;}中添加SocketContext属性,但接下来会发生什么,我们将找到谁知道队列大小,它是DataSocketSocketContext 1}}不知道,所以要将该属性拉到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; }}
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

SocketContext facade,类库中唯一的公共类。

我想说这可能是最初的问题之一。如果只有一个公共组件,那么它就很难公开功能。这也失败了单一责任,开放/封闭设计和界面隔离等概念。你基本上有一个对象在做所有事情。

可能只有SocketContextFacade这样的单一访问点,但这就是您输入API的方式,然后可以公开客户端可以与之交互的其他对象/组件。

我使用的第三方库通常有2个方面。

  1. 配置
  2. 运行
  3. 配置在启动时发生一次。它告诉图书馆如何满足您的特定需求。整个系统使用运行时,根据配置行事。以下是一些例子:

    1. 实体框架/ Nhibernate
      1. 配置 - 数据库映射
      2. 运行时 - session / dbcontext
    2. 流畅的验证
      1. 配置 - 验证规则
      2. 运行时 - 验证引擎和验证对象的结果
    3. 服务巴士
      1. 配置 - 端点路由,队列管理,错误处理
      2. 运行时 - 消息处理程序