如何查询存储在SQL持久性表中的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' 

但我正在寻找一种优雅的方法来做到这一点,可能使用NserviceBus API的。ParticularSoftware文档中描述了一个SagaFinder实现(链接:https://docs.particular.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);
});
}
}

任何想法都值得赞赏。非常感谢。

我们有关于在查询传奇状态的指导

https://docs.particular.net/nservicebus/sagas/#querying-传奇数据

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

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

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

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

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

最新更新