ServiceStack RedisTypedClient - можете ли вы использовать строки для определения типа? - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь выяснить, есть ли какой-нибудь способ создать RedisClient, который имеет функциональность RedisTypedClient, но может определить ключ URN с помощью простой строки вместо передачи типа.Например, в данный момент мы создаем IRedisTypedClient следующим образом:

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

Затем мы можем сохранять / извлекать связанные сущности на основе типов, которые мы знаем о :

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

Однако мы хотим управлять простыми данными JSON объектов из внешних служб (выбираемых конечными точками HTTP API).Эти объекты полезной нагрузки будут типами, о которых мы не будем знать в c #, но предоставят имена схем / типов, которые мы хотим использовать для управления отношениями, как мы делаем в клиенте с типом redis.Я не могу понять, возможно ли это в настоящее время без необходимости вручную управлять всеми дополнительными функциями, которые делают типизированных клиентов такими хорошими:

  • Идентификационный список для сущностей этого типа
  • Возможность извлекать / обновлять объекты, связанные с объектом
  • GetNextSequence для следующего идентификатора

Они не доступны в квартире IRedisClient, поэтому я хочу сделать что-то вродеthis:

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 Ответ

1 голос
/ 11 июля 2019

RedisTypedClient - можете ли вы использовать строки для определения типа?

Нет. Типизированные клиенты работают только с типами, а не с неизвестными структурами данных, вам нужно хранить любые произвольные данные JSON, используя строку IRedisClient.

Чтобы сохранить отношения, вы можете сохранить их в наборах Redis как , описанных в предыдущем ответе , что и делает API StoreRelatedEntities () за кулисами, где он сохраняет объекты, используя StoreAll() как обычно, но также поддерживает связанные объекты в наборе индексов, используя urn (например, urn:File:x) в качестве идентификатора, против которого сохраняется каждая сущность.

GetRelatedEntities () затем считывает все идентификаторы, сохраненные в «индексе набора отношений», и использует GetValues() для выборки всех сущностей по урнам.

...