gpt4 book ai didi

json.net - 从 RavenDB 获取 NServiceBus 订阅

转载 作者:行者123 更新时间:2023-12-02 05:18:00 28 4
gpt4 key购买 nike

有没有人尝试(并成功)使用 Raven DB .Net 客户端从 RavenDB 获取订阅?

有一些 Json 序列化问题,当以下运行时,它会抛出

“将值“Subscriber.Messages.Events.MyEvent,Version=1.0.0.0”转换为类型“NServiceBus.Unicast.Subscriptions.MessageType”时出错。消息

代码很简单:

            var documentStore = new DocumentStore
{
Url = "http://localhost:8080/",
DefaultDatabase = "publisher",
};

documentStore.Initialize();

using (var session = documentStore.OpenSession())
{

return session.Query<NServiceBus.Unicast.Subscriptions.Raven.Subscription>("Raven/DocumentsByEntityName").ToArray();
}

这绝对是一个序列化问题,因为检索有效。就像使用下面的替代方法一样:

session.Advanced.LuceneQuery<Subscription>("Raven/DocumentsByEntityName").QueryResult.Results[0]

在 RaveDB 工作室中,我可以在发布者数据库中看到以下文档。

{
"MessageType": "Subscriber.Messages.Events.MyEvent, Version=1.0.0.0",
"Clients": [
{
"Queue": "samplesubscriber",
"Machine": "myDesktopHere"
}
]
}

将值“Subscriber.Messages.Events.MyEvent,Version=1.0.0.0”转换为类型“NServiceBus.Unicast.Subscriptions.MessageType”时出错。

有人知道序列化失败的原因吗?

我正在使用 NServiveBus.Host 4.2、Raven-DB 客户端 1.0.616 和 Newtonsoft.json 4.0.5。

顺便说一句,我已经使用 dotpeek 提取了类型并创建了本地版本。我从 NSB dll 创建了自己的订阅、MessageType、MessageTypeConvertor。然后我设法毫无问题地反序列化字符串。有什么想法吗?

编辑

根据建议,高级 Lucene 查询在检索结果方面做得很好。但是反序列化失败了。比如第一行返回搜索结果,但是在return语句中反序列化失败。我已经从 NSB dll 中提取了订阅类型的本地版本,并实现了类型转换器,再次从 NSB 库中提取,并使用它们代替 NServiceBus.Unicast.Subscriptions.Raven.Subscription 工作正常。不可避免地,这不是一个稳定的选择。

var searchResults = session.Advanced.LuceneQuery<NServiceBus.Unicast.Subscriptions.Raven.Subscription>("Raven/DocumentsByEntityName").WhereEquals("Tag", "Subscription").QueryResult.Results;

return searchResults.Select(subscriptionJsonObject => JsonConvert.DeserializeObject<NServiceBus.Unicast.Subscriptions.Raven.Subscription>(subscriptionJsonObject.ToString())).ToList();

还有什么想法吗?

最佳答案

当您使用此表单查询时:

session.Query<Entity>("IndexName")

您要求从查询中返回该索引的所有项,然后告诉 RavenDB 客户端将它们所有反序列化为您指定的类型。

通常情况下,这会很有效,因为会为您正在使用的类型构建一个特定的索引。例如,您通常会为特定目的构建自己的订阅索引,并查询:

session.Query<Subscription>("Subscriptions/ByWhatever")

或者如果您从 C# 构建索引,您可能会喜欢这种语法来避免字符串:

session.Query<Subscription, Subscriptions_ByWhatever>()

你也可以让 Raven 自动为你建立一个索引:

session.Query<Subscription>()

由于您使用了内置的 Raven/DocumentsByEntityName 索引,因此您将返回数据库中的所有文档,而不仅仅是那些订阅的文档。由于只有一些可以反序列化为 Subscription 类型,因此其他人因序列化错误而失败。

如果您想继续使用该索引,则需要将其过滤为该类型的索引:

session.Advanced.LuceneQuery<Subscription>("Raven/DocumentsByEntityName")
.WhereEquals("Tag", "Subscriptions")

LuceneQuery 表单在这里更简单,因为您是按字符串名称过滤字段。

您可以使用常规的 LINQ 查询,但您必须创建一个包含 Tag 字段的类型,如下所示:

class RDBENIndexEntry
{
public string Tag { get; set; }
}

...

session.Query<RDBENIndexEntry>("Raven/DocumentsByEntityName")
.Where(x => x.Tag == "Subscriptions").OfType<Subscription>()

关于json.net - 从 RavenDB 获取 NServiceBus 订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19960423/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com