应用SOLID原则

时间:2018-02-06 09:55:29

标签: c# solid-principles

我正在尝试将SOLID原则应用于我的项目,并且不确定如何处理以下场景:

我有一个界面:

IService

和实现接口的类

Service : IService

IService中有很多方法,对于我的项目,我现在需要更新其中一种方法的功能,我们称之为method1

我对SOLID的理解是,我不应该更新method1,而是创建一个扩展ServiceServiceV2)并覆盖method1

的新类

我的问题是,ServiceV2只应展开Service,还是需要实施界面IService,然后展开Service并覆盖method1仅?

我问的主要原因是因为如果它实现IService这会影响我的依赖注入(简单的Injector),因为我只能注册一个实现IService的类

我认为我不会制作全新的IServcieV2ServiceV2,因为这会失去IServiceIServicev2之间的关系

另外,如果它只扩展Service,我还在实现依赖倒置,因为新类没有直接实现接口,但我认为它是间接的?

1 个答案:

答案 0 :(得分:1)

如果Service实施IServiceService2来自Service,那么Service2会自动实施IService,因为仅IService为特定目的定义可行类的部分签名。然后使用此类或自由签名定义来创建一个类型,该类型又定义object个成员。

签名不会通过继承而改变。它只能扩展。 这基本上是你唯一应该使用继承的东西:

如果Service2.Method1()的可见行为与Service.Method1()的可见行为不同,则表示Service2可见行为Service的可见行为。在这种情况下,您不应使用继承,而应使用实现IService的新类。因为在这种情况下它是不同的服务

让我举一个具体的例子,虽然在不同的背景下:

技术上,正方形是矩形的特殊情况,意味着Square : Rectangle。但是,如果方形的长度改变其宽度也会改变。对于矩形不是这种情况。因此,如果您有List<Rectangle>包含常规Rectangle以及Square个对象,那么您可以将Square定义为Rectangle的子项,你会有不同的可见行为。因此,Square不能成为Rectangle的孩子,因为您无法使用Rectangle代替Square。所以Square : Rectangle是假的。您可以同时实现一个接口IGeometry,将LengthWidth定义为属性,并在Rectangles中同时使用SquaresList<IGeometry>。接口不指定行为。只是签名。

如果您有IConfigService,您同样会将课程FileConfigServiceDatabaseConfigService定义为FileConfigService : IConfigServiceDatabaseConfigService : IConfigService,并让您的课程将其保留为{{因为他们不必关心任何类型的实现细节 - 他们只需要知道存在几个方法和属性。这也是为什么你为每个'目的'创建一个界面而不是为一切创建一个大的界面。为什么Interfaces只定义公共成员。

这基本上是大多数SOLID归结为的。

如果您只为IConfigService实施添加功能,则只更改此类。没有什么可以阻止你。

虽然你有一些类似于现有和正在运行的系统所依赖的web服务,但这是一个不同的故事 - 在这种情况下,我会看看版本控制。