ServiceStack的RedisTypedClient-您可以使用字符串定义类型吗?

时间:2019-07-11 14:34:12

标签: c# redis asp.net-web-api2 servicestack servicestack.redis

我正在尝试确定是否可以创建具有RedisClient功能但可以用简单字符串定义URN键而不是传递URN键的RedisTypedClient。类型。例如,此刻我们正在像这样创建IRedisTypedClient:

var redisProjectClient = _redisClientsManager.GetClient().As<Project>()

然后我们可以根据我们知道的类型来存储/检索相关实体:

var files = redisProjectClient.GetRelatedEntities<File>(projectId);

但是,我们希望管理来自外部服务(由HTTP API端点获取)的对象的简单JSON有效负载。这些有效负载对象将是我们在c#中不知道的类型,但是将提供我们希望能够用来管理关系的模式/类型名称,就像在redis类型的客户端中一样。我看不到当前是否有可能,而不必手动管理使类型客户端如此出色的所有额外内容:

  • 该类型实体的ID列表
  • 检索/更新与对象相关的实体的能力
  • GetNextSequence输入下一个ID

这些IRedisClient中没有,所以我想做这样的事情:

var file = "{...}" // JSON object provided by external service

// We will know it's a "Project" type with a "projectID" from the JSON payload data:

var redisProjectClient = _redisClientsManager.GetClient().As("Project"); 
redisProjectClient.StoreRelatedEntities("File", projectId, file);


// ...

var files = redisProjectClient.GetRelatedEntities("File", projectId);

是否知道这是否可行,或者如何创建这种类型的客户端?

1 个答案:

答案 0 :(得分:1)

  

RedisTypedClient-您可以使用字符串定义类型吗?

没有Typed客户端仅适用于Types,而不适用于未知的数据结构,您需要使用字符串IRedisClient存储任何任意的JSON有效负载。

要维护关系,您可以将它们存储在described in this previous answer的Redis集中,这是StoreRelatedEntities() API在后台使用StoreAll()正常存储实体的幕后所做的,而且还可以维护使用urn(例如urn:File:x)作为存储每个实体所依据的标识符的索引集中的相关实体。

GetRelatedEntities()然后读取维护在“关系集索引”中的所有ID,并使用GetValues()通过骨灰盒获取所有实体。