接口和类之间的一对一关系

我是一名 C# 程序员。在我的上一份工作和我现在的工作中,为我们编写的大多数类创建接口是很常见的。例如,当我们有一个名为 Spork 的类时,我们将添加一个包含 Spork 公共方法的接口 ISpork。这些接口用于依赖注入(例如通过 StructureMap)和在单元测试中创建模拟(例如使用 Rhino Mocks 或 Moq) .

几周前,我参加了一个 Javs 开发人员的演讲。我们不知何故开始谈论接口,他似乎真的很惊讶任何人都会在类和接口之间有很多一对一的关系。

现在我的问题是:这些年来我做错了吗?或者这是 Java vs C# 的事情?如果是,Java 中如何处理模拟和依赖注入?

PS:我主要对 DI 和模拟方面感兴趣,以及对许多只有一个实现类的接口的相关需求(或没有?)。我认为情况重新。既不会被模拟也不会被注入的类非常相似。但令我感到惊讶的是,作为 C# 开发人员,对我来说似乎很简单的事情对于那个 Java 开发人员来说是完全闻所未闻的。


哈士奇WWW
浏览 110回答 2
2回答

慕斯709654

DI 可以只用类而不用接口来制作。您注册类型,然后注入类型。就这样。在谈论单元测试中的模拟时会出现差异。在 c# 中,您只能模拟虚拟或抽象(也是虚拟)成员。因此,如果你希望你的代码是可测试的,你需要用virtual关键字标记所有公共成员,或者在你的实现中使用接口而不是真正的类。在 Java 中,默认情况下所有方法都是虚拟的,因此它们不会与一对一接口混淆,因为它们可以模拟所有内容。

元芳怎么了

依赖注入用于包含和分离关注点。你想在你的代码中做一些新的事情,你添加一个依赖接口来实现。然后您可以测试您的代码,甚至不必为该接口的实现操心,直到稍后。不过,您的问题是关于接口和实现之间的一对一关系。从我的角度来看,这无关紧要,因为您只关心已经声明的接口上下文中的实现,而不是使用它的地方。例如,你可以让一个类继承多个可注入接口,这通常表明它有太多的责任,但这是可以做到的。您可以有多个继承相同接口的类,然后根据 DI 配置使用。甚至在某些情况下,DI 容器会处理我通常委托给工厂的东西,主要是为您提供基于某些参数的接口的实现。无论哪种方式,这有什么关系?如果(减少到荒谬)每个类有一个开发人员,那么他们将只编写代码和测试并定义所需依赖项的接口,让其他人实现它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java