Non dovresti contenere istanze singleton di RedisClient
o IRedisTypedClient<BarSet>
che entrambi incapsula una connessione Redis TCP non thread-safe. Puoi invece tenere istanze singleton di IRedisClientsManager
- che è il suo scopo di fornire una fabbrica client Redis thread-safe (come un pool di connessioni DB).
Se stai utilizzando anche i servizi ServiceStack, è più facile registrare le dipendenze nell'IOC di ServiceStack, quindi IRedisClientsManager
può essere iniettato come qualsiasi altra dipendenza, ad esempio in AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Ciò ti consentirà di utilizzare base.Redis
RedisClient nei tuoi servizi ServiceStack, ad esempio:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Se usi base.Redis
non è necessario disporre esplicitamente del RedisClient in quanto è già automaticamente eliminato dal Servizio, ovvero:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Puoi anche iniettare IRedisClientsManager
nelle tue classi come qualsiasi altra dipendenza usando una proprietà pubblica o un argomento Costruttore, ad esempio:
public class RedisBarSetData
{
public virtual IRedisClientsManager RedisManager { get; set; }
private IRedisClient redis;
public virtual IRedisClient Redis
{
get { return redis ?? (redis = RedisManager.GetClient()); }
}
public override void Dispose()
{
if (redis != null)
redis.Dispose();
}
public List<BarSet> getData(BarSets data)
{
setKeys(data); // instrument_key is set in here
return Redis.As<BarSet>().Lists[instrument_key].GetAll();
}
}
Che puoi quindi registrare e collegare automaticamente nell'IOC di ServiceStack con:
container.RegisterAutoWired<RedisBarSetData>();
Ciò ti consentirà quindi di utilizzarlo come dipendenza nei tuoi Servizi:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Un'alternativa alla creazione della propria classe base consiste nell'ereditare dalla classe base LogicBase preesistente, che ha già IRedisClientsManager
proprietà e sopra boilerplate.