首页 > 解决方案 > 将注入的依赖项传递给外部函数

问题描述

我有一个 NestJS 应用程序,其中我有一些关于使用 AWS S3 存储桶的逻辑。

我有一个模块,其中包含一个带有promiseWrapper函数的服务,用于将回调转换为异步。

  private s3PromiseWrapper(action: string, params: S3ParamGetDTO): Promise<string> {
    console.log(params)
    return new Promise((resolve, reject) => {
      this.s3.getSignedUrl(
        action,
        {
          Bucket: params.bucketName,
          Key: params.key,
          Expires: params.expirationTimeSeconds,
        },
        (err: any, url: string) => {
          if (err) reject(err)
          resolve(url)
        }
      )
    })

没有另一个模块,需要使用相同的函数,所以不要重复我想创建一个全局函数作为util函数的代码,但这需要我将实例作为参数传递给函数。

  private s3PromiseWrapper(action: string, params: S3ParamGetDTO, s3Instance: S3): Promise<string> {
    console.log(params)
    return new Promise((resolve, reject) => {
      s3Instance.getSignedUrl(
        action,
        {
          Bucket: params.bucketName,
          Key: params.key,
          Expires: params.expirationTimeSeconds,
        },
        (err: any, url: string) => {
          if (err) reject(err)
          resolve(url)
        }
      )
    })

就依赖注入而言,这是反模式吗?

标签: node.jsamazon-s3design-patternsdependency-injectionnestjs

解决方案


您可以按以下方式创建 s3 包装器

 @Injectable({scope: transient})
    export class S3Service {

    private s3 = null //or just initiate the object;

    init() {
      this.s3 = new S3();
    }

    s3PromiseWrapper(action: string, params: S3ParamGetDTO): Promise<string> {
        console.log(params)
        return new Promise((resolve, reject) => {
          this.s3.getSignedUrl(
            action,
            {
              Bucket: params.bucketName,
              Key: params.key,
              Expires: params.expirationTimeSeconds,
            },
            (err: any, url: string) => {
              if (err) reject(err)
              resolve(url)
            }
          )
        })
    }

在任何其他服务中注入相同的服务

MYService() {
  constructor(
    private s3: S3Service
  ) {
    this.s3.init()
  }

  mymethod() {
    this.s3.s3PromiseWrapper()
  }
}

但是,请为其他需要的东西编写一个包装器。

javascript aws-sdk 已经提供了所有方法的承诺版本。可以通过附加.promise()到方法来访问。

例如

this.s3.getSignedUrl(params).promise()

推荐阅读