将注入的依赖项传递给外部函数

Posted

技术标签:

【中文标题】将注入的依赖项传递给外部函数【英文标题】:Passing injected dependencies to external functions 【发布时间】:2021-04-06 03:06:52 【问题描述】:

我有一个 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)
        
      )
    )

从依赖注入的角度来看,这是反模式吗?

【问题讨论】:

为什么不直接使用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()

【讨论】:

以上是关于将注入的依赖项传递给外部函数的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 依赖注入

如何使用 Angular 中的依赖注入将属性指令实例传递给嵌套组件

我应该如何将依赖项传递给我的类?

C++ 中带智能指针的依赖注入

如何在 Laravel Facades 中传递依赖项?

Spring:所有依赖项注入的类型