1

我很难找到一种干净的方式来实现我的分层。

这是我拥有的层(下层支持上层,通过继承或组合):

Business Logic Layer (BLL)
Datastore Layer (DSL)
Database Layer (DBL), Web-Service Buffer (WSB)

当 BLL 对象发出 get 请求 getRecords() 时,它又要求 DSL 完成它。

然后 DSL 决定天气是使用本地 DBL 还是使用 WSB(它与远程 Web 服务前端与“主”数据库通信)。


选项 1 - 组合(BLL 有一个 DSL,DSL 有一个 DBL)


我的问题是,由于 DSL 和 DBL 对象是在 BLL 中组成的,它们对包含 BLL 一无所知,那么他们应该如何进行包含 BLL 字段的特定 DB 查询?


选项 2 - 继承(BLL:DSL,DSL:DBL)


即使较低层现在可以通过公共/受保护的继承访问 BLL,但关于 DSL 和 DBL 如何准确知道要生成哪些特定查询字符串的问题仍然存在。我想 BLL 可以保留一组静态字符串,但这会产生双向依赖,我认为这是一个非常有缺陷的设计,会带来可怕的后果。

注意:每个 BLL 都有一个对应的表,它被序列化到/反序列化。

注意:我不想使用反射,并且想限制泛型的使用(除非绝对没有其他方法。我正在为我的 WSB 使用泛型,虽然我主要关心的是生成DSL 和 DBL 层中特定于 BLL 的查询字符串)。

注意:将会有许多不同的 BLL 对象将使用 DSL 和 DBL 层,而不仅仅是一个(否则这将是微不足道的)。

public class BL1 
{
  private DSL _dsLayer;

  public getRecords() 
  {
    // ...
    _dsLayer.getRecords();
    // ...
  }
}

public class DSL 
{
  private DBL _dbLayer;
  private WSB _wsBuffer;

  public getRecords() 
  {
    if(_dbLayer.getRecords() != null)
    {
      return records;
    }
    else
    {
      return _wsBuffer.getRecords();
    }
  }
}

public class DBL
{
  private string _db = "file.db3";

  public getRecords()
  {
    select ????? - how to know what fields to grab
  }
}

感谢您花时间回答这个问题,非常感谢。

4

3 回答 3

2

您应该使用组合。我认为继承没有意义,因为这些是完全不同类型的实体,实际上一个不能从另一个继承。他们将继承哪些领域?谁从谁那里继承?

BLL 需要传递“字段”列表才能到达 DSL。要么作为 DSL 方法的参数,要么以其他方式。DSL 方法只是接收一些字段列表作为参数并使用它们。我认为这是一个可行的解决方案。

此外,您应该在每一层创建接口并针对它们进行编程,而不是使用类型本身。例如,在您编写的示例代码中,将 DBL 和 WSB 更改为 IDBL 和 IWSB。这将帮助您更好地测试并允许代码中的松散耦合。

public class DSL 
{
  private IDBL _dbLayer;
  private IWSB _wsBuffer;
....

}
于 2012-07-17T15:11:42.353 回答
1

通常,当您具有“Is-A”关系时,应使用继承。既然你不能说 BLL 'Is-A' DSL 或 DSL 'Is-A' DBL,那么我会考虑组合而不是继承。这具有使测试每个逻辑层更容易的副作用,因为您可以存根或模拟每个依赖项。

通常,在任何公开的 API 中,服务器端(因此 DSL 在 BLL -> DSL 方面)需要公开对象才能完成工作。您指出 DSL 不应该知道 BLL 对象是正确的。因此,挑战在于为 DSL 编写一个干净的 API,该 API 暴露给 BLL 以查询数据。

我建议查看DDD中的RepositorySpecification模式。这些有助于解决您提出的一些问题。

于 2012-07-17T15:14:50.070 回答
1

作品。因为dtryon 和desigeek所说的一切,也 因为在您的情况下,继承看起来不自然 + 它将使您的所有 层紧密耦合,并且几乎不会限制对源代码的任何修改。

我相信看一下prefer-composition-over-inheritance SO-topic可能会有所帮助。

于 2012-07-17T15:47:38.537 回答