【问题标题】:IFindSagas with Raven saga persistence and multiple properties in NServiceBusIFindSagas 具有 Raven saga 持久性和 NServiceBus 中的多个属性
【发布时间】:2018-01-17 19:37:56
【问题描述】:

我正在使用 Raven 来持久化 saga,我想实现 IFindSagas,我需要根据 SiteIdEmailAddress 两个属性来查找 saga,所以 ConfigureMapping 将不起作用。 ISagaPersister 接口只允许您通过单个属性查找单个 saga。

我已经实现了一个像这样的 saga finder

public class MySagaFinder : IFindSagas<MySagaData>.Using<ISomeMessage>
{
    public ISagaPersister Persister { get; set; }

    public MySagaData FindBy(ISomeMessage message)
    {
        var lookup = string.Format("{0}__{1}", message.SiteId, message.EmailAddress);
        return Persister.Get<MySagaData>("SagaLookup", lookup);
    }
}

所以基本上我在MySagaData 上添加了一个名为SagaLookup 的属性,它是SiteIdEmailAddress 的串联。然后我可以通过这个查找它。这感觉就像一个黑客。有没有什么方法可以使用 saga 持久化器,我可以通过多个属性返回一个 saga,或者根据一个属性返回一个 saga 列表,然后我可以通过另一个属性进行过滤?

【问题讨论】:

  • 通常这表明缺少域概念。您的域中的哪些内容由 siteId 和电子邮件标识?
  • 一个用户网站邀请,有人建议我可以为每一个生成一个唯一的 id,但我真的不需要这个 id 来做其他事情,并试图避免更多数据
  • 我意识到我对此很愚蠢,我正在生成一个随机字符串的验证码并通过电子邮件发送出去。我现在要使用一个 guid,也将它用作 saga 标识符并简化整个过程,谢谢!
  • 很好,事情通常会这样结束:)

标签: nservicebus saga


【解决方案1】:

IMO 最好通过单个“键”属性进行查找,因为这样您就不需要实现自定义持久性。连接站点 ID 和电子邮件地址可能看起来像一个 hack,但如果你认为这是定义特定 saga 的 ID,那么它是有道理的。传奇数据不是您的领域模型的一部分,它是具有特定要求的基础设施的一部分。但是,您应该考虑这个 saga ID 的定义是否足够独特。例如,同一站点 ID 中的同一用户的两个 saga 是否有可能同时执行?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多