如何查询存储在 SQL Persistence 表中的 Sagas

Art*_*Cam 1 nservicebus nservicebus-sagas

我需要查询 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' 
Run Code Online (Sandbox Code Playgroud)

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

文档中的实现方式如下:

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);
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ach 5

我们提供了有关查询 saga 状态的指南,网址为

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

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

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

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

  • 通过将数据暴露在传奇中业务逻辑的保护之外,存在数据不被视为只读的风险。最终,组件尝试绕过传奇并直接修改数据。
  • 查询数据可能需要额外的索引、资源等,这些需要由发出查询的组件来管理。这些额外的资源会影响传奇的性能。