Neměli byste uchovávat žádné jednotlivé instance RedisClient
nebo IRedisTypedClient<BarSet>
které oba zapouzdřují připojení Redis TCP Connection, které není bezpečné pro vlákna. Místo toho můžete držet jednotlivé instance IRedisClientsManager
- jehož účelem je poskytnout vláknově zabezpečenou Redis Client Factory (jako fond připojení DB).
Pokud také používáte ServiceStack Services, je jednodušší zaregistrovat závislosti v IOC ServiceStack, takže IRedisClientsManager
lze vložit jako jakoukoli jinou závislost, např. v AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
To vám umožní používat base.Redis
Vlastnost RedisClient ve vašich službách ServiceStack, např.:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Pokud používáte base.Redis
nemusíte RedisClient výslovně zlikvidovat, protože je již automaticky zlikvidován službou, tj.:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Můžete také aplikovat IRedisClientsManager
do vašich vlastních tříd jako jakékoli jiné závislosti pomocí veřejné vlastnosti nebo argumentu konstruktoru, např.:
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();
}
}
Které se pak můžete zaregistrovat a autowire v IOC ServiceStack s:
container.RegisterAutoWired<RedisBarSetData>();
Což vám pak umožní používat jej jako závislost ve vašich službách:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Alternativou k vytvoření vlastní základní třídy je dědění z již existující základní třídy LogicBase, která již má
IRedisClientsManager
majetku a nad typovým štítkem.