我也在做同样的事情!首先:我的架构有点不同。我有一个用户、一个主题和一个评论。该主题只是一个带有评论ID列表(IEnumerable long)的类,仅此而已。第一条评论是帖子。
哦,首先,一点警告:我刚刚开始使用 Service Fabric,所以我可能做错了;)
该用户与我无关。我只是将用户标识存储在评论中。在检索 cmets 列表时,我从有状态用户服务中获取用户。或者我直接把用户名存到评论里,还不确定。
所以这给我留下了主题和 cmets。首先我想'让我们创建一个有状态的主题服务和有状态的评论服务'。但后来我意识到,对于我加载的每个主题,我都需要为每个评论调用 CommentService 以获取 cmets。
所以我创建了一个处理 2 个 IReliableDictionaries 的 TopicService:主题和 cmets。
每当发表评论时,我都会使用 TopicId 作为分区键,并在该分区中存储评论。所以不要使用commentid!这样特定主题的所有 cmets 都在同一个分区中。
在加载包含所有 cmets 的主题时,我再次使用 TopicId 作为分区键,从主题的可靠字典中获取主题,并在 cmets 的可靠字典中循环评论 ID 列表。不确定它是否有帮助,但我的 GetComments 看起来像这样:
var topics = await this.StateManager.GetOrAddAsync<IReliableDictionary<long, TopicModel>>("topics");
var comments = await this.StateManager.GetOrAddAsync<IReliableDictionary<long, CommentModel>>("comments");
List<CommentModel> result = new List<CommentModel>();
using (var tx = this.StateManager.CreateTransaction())
{
ConditionalValue<TopicModel> topic = await topics.TryGetValueAsync(tx, topicid);
if(topic.HasValue)
{
foreach(long commentid in topic.Value.CommentsInternal)
{
ConditionalValue<CommentModel> comment = await comments.TryGetValueAsync(tx, commentid);
if (comment.HasValue)
result.Add(comment.Value);
}
}
await tx.CommitAsync();
}
return result;
我还没有完成,方法还有一些工作。
也许这对你有帮助:)
编辑:哦,有一个缺点!当您想通过其 id 加载单个评论时,您需要提供 topicid。所以我的 CommentModel 类有一个 CommentId 和一个 TopicId 属性。