No debe tener ninguna instancia singleton de RedisClient
o IRedisTypedClient<BarSet>
que encapsula una conexión Redis TCP no segura para subprocesos. En su lugar, puede mantener instancias singleton de IRedisClientsManager
- cuyo propósito es proporcionar una Redis Client Factory segura para subprocesos (como un conjunto de conexiones de base de datos).
Si también usa los servicios de ServiceStack, es más fácil registrar las dependencias en el IOC de ServiceStack, así que IRedisClientsManager
se puede inyectar como cualquier otra dependencia, por ejemplo, en AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Esto le permitirá usar base.Redis
RedisClient propiedad en sus Servicios ServiceStack, por ejemplo:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Si usa base.Redis
no es necesario que elimine explícitamente RedisClient, ya que el Servicio ya lo eliminó automáticamente, es decir:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
También puede inyectar IRedisClientsManager
en sus propias clases como cualquier otra dependencia usando una propiedad pública o un argumento Constructor, por ejemplo:
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();
}
}
Que luego puede registrar y autoconectar en el IOC de ServiceStack con:
container.RegisterAutoWired<RedisBarSetData>();
Lo que luego le permitirá usarlo como una dependencia en sus Servicios:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Una alternativa a la creación de su propia clase base es heredar de la clase base LogicBase preexistente, que ya tiene IRedisClientsManager
propiedad y por encima del estándar.