Передача введенных зависимостей внешним функциям

#node.js #amazon-s3 #design-patterns #dependency-injection #nestjs

#node.js #amazon-s3 #шаблоны проектирования #внедрение зависимостей #nestjs

Вопрос:

У меня есть приложение 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)
        }
      )
    })
 

Является ли это антишаблоном с точки зрения внедрения зависимостей?

Комментарии:

1. Почему бы просто не использовать S3.getSignedUrlPromise метод вместо этого?

Ответ №1:

Вы можете создать оболочку 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()