【问题标题】:Pulling property up to Facade将物业拉到门面
【发布时间】:2012-12-05 00:22:34
【问题描述】:

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

问题如下:假设SocketContext消费者想要监控发送的消息队列(发送过程是异步的)。

好吧,我们需要在SocketContext 中添加int QueueSize {get;} 属性,但接下来我们要找到知道队列大小的人,这是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; }}
}

我做错了什么?

【问题讨论】:

    标签: c# design-patterns architecture


    【解决方案1】:

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

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

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

    我使用的很多 3rd 方库通常有两个方面。

    1. 配置
    2. 运行时

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

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

    【讨论】:

    • 嗯,我在设计时考虑了 EF,我的 Context 应该像 DbContext。典型用法是:var context = new SocketContext(ip, port);context.Subscribe(messageId,messageHandler);`context.Send(message);'。我看不出制作更多的公共课程会有什么帮助:(
    • 仅仅将其公开是无济于事的。但如果它是公开的,它可以暴露给客户。 SocketContext 可能会暴露 DataSocketConnection 对象本身,而不是套接字或连接的属性。
    • 事情是 - 类在责任链中,只有相邻的类是相互了解的,如果我将 IDataSocket _dataSocket; IConnection _connection;ISocketClient _client; 公开,消费者就可以访问像这样context.Client.Connection.DataSocket.QueueSize 这样的所需属性很好,我猜
    • ...但是现在所有的中间类都可以相互访问,或者我是偏执狂吗?
    • 对我来说,这么深的对象链似乎仍然是一个设计问题。但是鉴于代码数量有限,没有什么可以做的了。您可能希望将您的代码发布到codereview.stackexchange.com 以获得更多关于整体设计的意见。
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多