0

我需要查询 Saga Data 类的属性以获取列表。它作为序列化对象存储在 SqlPersistance 表 [Data] 列中。想想我的 SagaData 有一个名为 UserName 的属性的场景,所以我想查询与该用户相关的每个 saga。以一种草率的方式,我可以查询列内容,获取列表,并可以从内容中创建 Saga 对象,通过如下查询:

SELECT [Id]
      ,[Correlation_TaskId]
      ,[Metadata]
      ,[Data]
      ,[PersistenceVersion]
      ,[SagaTypeVersion]
      ,[Concurrency]
  FROM [myWonderfulDb].[dbo].[MyWonderfulPeristanceTable]
  where JSON_VALUE(Data,'$.Username') = 'arthur' 

但我正在寻找一种优雅的方法,可能使用 NserviceBus API。ParticularSoftware 文档(链接: https ://docs.particular.net/persistence/sql/saga-finder)中描述了一个 SagaFinder 实现,但这仅返回一个不完全适合我的场景的对象。

这里是如何在文档中实现的:

class SqlServerSagaFinder :
    IFindSagas<MySagaData>.Using<MyMessage>
{
    public Task<MySagaData> FindBy(MyMessage message, SynchronizedStorageSession session, ReadOnlyContextBag context)
    {
        return session.GetSagaData<MySagaData>(
            context: context,
            whereClause: "JSON_VALUE(Data,'$.PropertyPathInJson') = @propertyValue",
            appendParameters: (builder, append) =>
            {
                var parameter = builder();
                parameter.ParameterName = "propertyValue";
                parameter.Value = message.PropertyValue;
                append(parameter);
            });
    }
}

任何想法表示赞赏。谢谢!

4

2 回答 2

3

我们有关于查询 saga 状态的指南,请访问

https://docs.particular.net/nservicebus/sagas/#querying-saga-data

简而言之,您可以查询 saga 数据,NServiceBus 没有提供开箱即用的方法,因为我们建议使用不同的方法:

saga 发布包含所需数据的事件,并具有处理这些事件的处理程序,并将数据存储在一个或多个读取模型中以用于查询目的。

在我看来,我们不推荐它的主要观点是这两个

  • 通过将数据暴露在 saga 中业务逻辑的保护措施之外,风险在于数据不会被视为只读。最终,一个组件试图绕过 saga 并直接修改数据。
  • 查询数据可能需要额外的索引、资源等,这些需要由发出查询的组件管理。这些额外的资源会影响 saga 的性能。
于 2020-11-04T08:09:55.563 回答
2

SagaFinder的唯一目的是找到与传入消息相关的某个 saga 的单个实例。我不知道查询 saga(数据)实例的任何框架功能。

于 2020-11-03T10:20:11.070 回答