【问题标题】:Construct a batch without relying on a single instance of the WriteBatch class在不依赖 WriteBatch 类的单个实例的情况下构造批处理
【发布时间】:2020-03-10 03:07:31
【问题描述】:

我想使用不依赖于单个 WriteBatch 实例的函数来构建一组批处理操作。现在,我必须将 WriteBatch 类的一个实例传递给函数,然后这些函数可以在批处理上调用 .set().update().delete() 函数。

以我的代码为例:

export class BatchHelperService {

  constructor(private afStore: AngularFirestore) { }

  executeBatchActions(batchActions: BaseBatchAction[]): Observable<void> {
    const batch = this.afStore.firestore.batch();
    batchActions.forEach(action => action.attachActionToBatch(batch));
    return from(batch.commit());
  }
}

我这里有一个函数,它接受基类BaseBatchAction 的数组。我有三个派生类,代表三种批处理操作类型(设置、更新、删除)。它们都实现了attachActionToBatch() 函数,但它依赖于传入一个已经创建的WriteBatch 对象。

我想删除此依赖项,因为它违反了 monadic 函数的干净代码原则(避免使用输出参数)。 SDK可以做到这一点吗?

【问题讨论】:

  • 虽然您可以让action.attachActionToBatch() 接受一个或不接受参数,并根据需要创建批处理,但它将在哪里获取firestore 实例以首先创建批处理以及如何你打算在批处理中链接多个操作?我相信您现在拥有的代码是您可以使用的最易理解的代码。只要你的抽象 API 是可以理解的并且遵循单子范式,我不明白为什么实现它的代码也必须是单子的。

标签: angular typescript firebase google-cloud-firestore


【解决方案1】:

您将需要使用 WriteBatch。除了编写避免此构造的 Firestore 批处理之外,别无选择。它总会在某个地方。

如果您想分离关注点,您可以做的是创建自己的批处理抽象/封装(可能是一个包装器对象),它不会在外部显示任何 Firestore API,但会在内部使用它们。您可以传递此包装器对象并以您认为合适的方式处理您的代码。看起来您已经开始使用 BaseBatchAction,但我认为您需要对整个批次进行更大的抽象,而不仅仅是单个更改。

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多