【问题标题】:Inheritance or Injecting in TypescriptTypescript 中的继承或注入
【发布时间】:2023-03-12 04:15:01
【问题描述】:

我使用 Typescript 和 NestJS 框架创建了一个大型项目,我想在 OOP 架构中创建这个项目,我有一个关于它的重要问题。我想创建一个具有公共功能的基础服务,该功能将在项目中的几乎所有服务中使用,并且我有两种使用公共部分的方法。

首先是创建一个具有公共方法的抽象类,如下所示:

export abstract class BaseService {}

并在目标服务中继承这个抽象类:

export class UserService extends BaseService {}

多亏了这一点,我可以使用 BaseService 中存在的所有方法,使用 this 关键字并创建对该函数的引用。

但我有第二种方法,通过 constrcutor 使用注入服务:

export class BaseService {}

并通过构造函数注入:

export class UserService {
    constructor (
        private readonly baseService: BaseService
    ){}

    someMethod(): void {
         return baseService.getHelloWorld();
    }
}

通过这种方式,我可以通过注入服务创建引用严格。

现在我有一个问题。在大型项目中哪种方法更好?

PS。我更喜欢在方法而不是类上创建基于<T> 的通用函数

【问题讨论】:

  • 一般规则始终是“优先委托而不是继承”。
  • 所以当我应该使用继承和/或抽象类/
  • 我同意@WiktorZychla。回答你的问题 > 所以当我应该使用继承和/或抽象类/理想情况下,永远不要
  • 继承是一种严格的耦合。重构的痛苦。委托更安全,因为您可以将注入的实体声明为抽象的,并且只在组合时使用实际的具体类型。整个 DI 建立在此之上。

标签: node.js typescript oop nestjs


【解决方案1】:

在这种特殊情况下,委托给注入服务更合适。如果您这样做,您可能应该将BaseService 重命名为不暗示它是要被其他服务类继承的基类的名称。我建议SharedServiceCommonService

委托在这里更好,因为您的设计表明BaseServiceUserService 没有相同的含义和目的,而只有共同的操作。减少代码重复不应成为选择继承的主要理由。

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 2014-10-14
    • 2016-11-18
    • 1970-01-01
    • 2023-03-28
    • 2016-04-03
    • 2021-08-17
    • 2021-11-08
    • 2017-10-10
    相关资源
    最近更新 更多