Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承与组合——面向对象的体系结构考虑_C#_Oop_Design Patterns_Inheritance_Composition - Fatal编程技术网

C# 继承与组合——面向对象的体系结构考虑

C# 继承与组合——面向对象的体系结构考虑,c#,oop,design-patterns,inheritance,composition,C#,Oop,Design Patterns,Inheritance,Composition,我很难想出一个干净的方法来实现我的分层 以下是我拥有的层(较低的层通过继承支持较高的层 (或组成): 当BLL对象发出get请求getRecords()时,它反过来要求DSL完成该请求 DSL然后决定使用本地DBL还是使用WSB(与远程web服务前端通信到“主”DB) 选项1-合成(BLL有一个DSL,DSL有一个DBL) 我的问题是,既然DSL和DBL对象是在BLL中组成的,它们对包含BLL的内容一无所知,那么它们应该如何进行包含BLL字段的特定DB查询呢 选项2-继承(BLL:DSL,

我很难想出一个干净的方法来实现我的分层

以下是我拥有的层(较低的层通过继承支持较高的层 (或组成):

当BLL对象发出get请求getRecords()时,它反过来要求DSL完成该请求

DSL然后决定使用本地DBL还是使用WSB(与远程web服务前端通信到“主”DB)


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


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


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


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

注意:每个BLL都有一个对应的表,可以对其进行序列化/反序列化

注意:我不想使用反射,而是想限制泛型的使用(除非绝对没有其他方法。我在我的WSB中使用genreics,这很好,尽管我主要关心的是在DSL和DBL层中生成BLL特定的查询字符串)

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


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

您应该选择作文。我不认为继承是有意义的,因为它们是完全不同类型的实体,实际上一个不能从另一个继承。他们将继承哪些领域?谁从谁那里继承

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

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

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

}

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

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

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

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

}

一般来说,当您有“Is-A”关系时,应该使用继承。既然你不能说BLL是DSL或者DSL是DBL,那么我就看组合而不是继承。这样做的副作用是使测试每个逻辑层变得更容易,因为您可以存根或模拟每个依赖项

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


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

一般来说,当您有“Is-A”关系时,应该使用继承。既然你不能说BLL是DSL或者DSL是DBL,那么我就看组合而不是继承。这样做的副作用是使测试每个逻辑层变得更容易,因为您可以存根或模拟每个依赖项

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

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

。 因为德特赖恩和德斯吉克所说的一切,也因为德特赖恩和德斯吉克所说的一切 因为在您的情况下,继承看起来不自然+它将使您的所有
层紧密耦合,几乎不会限制对源代码进行任何修改

我相信看看这样的主题会有所帮助。

作文。 因为德特赖恩和德斯吉克所说的一切,也因为德特赖恩和德斯吉克所说的一切 因为在您的情况下,继承看起来不自然+它将使您的所有
层紧密耦合,几乎不会限制对源代码进行任何修改


我相信看一下SO主题可能会有所帮助。

是的,我想你对“字段列表”参数传递给DSL的看法是正确的。出于某种原因,我认为这会创建一个依赖项,但它只是一个函数参数,就像其他参数一样,对吗?谢谢desigeek。传递参数不是依赖性的原因或来源。您将使用其方法的类将是容器类(so DSL)的依赖项
public class DSL 
{
  private IDBL _dbLayer;
  private IWSB _wsBuffer;
....

}