将注入的依赖项传递给外部函数
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()
【讨论】:
以上是关于将注入的依赖项传递给外部函数的主要内容,如果未能解决你的问题,请参考以下文章