【问题标题】:C#: Interface implementation structures and overridingC#:接口实现结构和覆盖
【发布时间】:2012-07-26 10:08:28
【问题描述】:

我有一个具有这种结构的 C# 解决方案:

  • 项目1:包含一个Dao(可以包含多个)
  • 项目2:包含一个接口(只有一个)
  • 项目 3:具有自己接口的 wcf 服务

  • 项目1中的dao实现了项目2中的接口。

  • 项目 3 中的 wcf 服务接口实现/继承/继承了项目 2 中的接口。

我遇到的问题是需要项目 2 中的接口来描述我的 dao 类。需要wcf接口来描述我在项目3中的wcf服务中有哪些功能。这两个接口完全一样,除了wcf属性在wcf接口上,因为dao中的所有功能都需要通过wcf 服务文件也是如此。实现或更确切地说是 dao 类可以更改/交换,但必须始终遵循相同的结构,因此需要接口。现在,当我尝试在我的 wcf 接口中实现它时,这两个接口是相同的,我被告知我必须有效地覆盖我派生的接口中的所有方法。这是正确的做法吗? wcf 接口需要实现项目 2 中的接口,以便提供我们需要的 dao 中的所有功能(这就是全部)。

之前我的项目设置如下:

  • 项目1:包含道
  • 项目 2:包含与 wcf 的接口 属性也是如此
  • 项目 3:不包含接口,只包含 wcf 服务

dao 和 wcf 服务都实现了与项目 2 相同的接口。将 wcf 属性放在接口上是否会在与 dao 一起使用时产生任何不利影响?我可能遇到的一个问题是 wcf 接口最终可能具有基本接口没有的额外功能,因此我认为以前的结构是错误的。说实话我不知道。

我知道我可能没有很清楚地解释它,实际上这里涉及两个甚至三个问题,但这是最好的表达方式。我想我的三个主要问题如下:

  1. 哪种继承/实现结构最好,为什么?
  2. 将实现 wcf 服务使用的相同接口 普通类有任何不良影响(由 wcf 属性引起,即 [ServiceContract]、[OperationContract])。
  3. 是否会覆盖基接口提供的所有方法 正确吗?

【问题讨论】:

  • 为什么dao要实现接口?您可以从中获得什么好处,实现相同的界面。由于恕我直言,接口是旨在遵守某些业务逻辑的合约,而不是数据访问。
  • 因为我想要一个接口来描述某种类型的 dao 以及它应该具有的方法。它只是对接口的简单编程。我可能有多个实现此接口的 dao,我希望它们都明确地具有相同的方法,这将使它们可互换,以便 wcf 服务可以以统一的方式访问它们,无论使用哪个 dao。我将使用行 IClusterQueryService foo = new MyDao() MyDao 实现接口。这意味着我可以使用任何 dao,只要它实现了 IClusterQueryService 接口。
  • 同意 100%,但我的问题是为什么 DAO 具有与业务向外部世界公开的 WCF 服务相同的接口,这两者不应该不同吗?
  • 好吧,通常我猜它们会有所不同,但我的界面和 dao 是在引入 wcf 之前设计的,碰巧dao 中的所有功能实际上都需要通过 wcf 公开,所以两个接口(一个用于描述 dao,一个用于 wcf)碰巧是相同的。

标签: c# inheritance interface overriding


【解决方案1】:

您首先定义的结构很好,您有一个实现接口的接口,并且子接口可以添加基础中没有的新方法。但是,您不需要在子接口中定义基本方法,因为它们都是继承的,所以现在您的子接口将为空。在此模型中,子接口可以具有 WCF 属性。

现在,您是否必须在 WCF 服务中实现所有这些方法?很简单,因为这就是接口的作用——它们定义了必须实现的契约。

【讨论】:

  • 感谢您的回复。我不明白的一件事。在解决方案一中给出的场景中,我会将 wcf 属性放在父/基接口上吗?属性是否与方法本身一起继承?我问是因为如果 wcf 属性不存在,那么我不能将它用作 wcf 接口,除非我覆盖子接口中的方法,否则我无法在实现父接口后添加属性,因此它们需要来自某个地方。
  • WCF 属性在子界面上。从另一个继承的那个。这是放置它们的正确位置,因为如果您要公开不在其他接口中的新方法,您可以从那里开始。
  • 那么您是说我应该重写父接口中的方法,以便将属性添加到这些方法中,因为我目前需要将父接口中的所有方法公开为 wcf 方法。对不起,如果我觉得我很愚蠢,但我想确保我理解正确
  • 啊,是的,我明白你在说什么,好吧,我会说你将不得不做一些我通常不会推荐的事情。将基接口设为 ServiceContract,将所有方法设为 OperationContract。我并不是说服务合同不应该相互继承——但基本接口最初是为了其他东西而设计的,现在正在被移植。如果你愿意,你也可以覆盖这些方法——但是通过在两者上添加属性会像真正的界面一样工作。
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2020-06-14
  • 2019-03-19
相关资源
最近更新 更多