Du bör inte ha några enstaka instanser av RedisClient
eller IRedisTypedClient<BarSet>
som båda inkapslar en icke trådsäker Redis TCP-anslutning. Du kan istället hålla enstaka instanser av IRedisClientsManager
- vilket är dess syfte att tillhandahålla en trådsäker Redis Client Factory (som en DB Connection Pool).
Om du också använder ServiceStack Services är det lättare att registrera beroenden i ServiceStacks IOC så IRedisClientsManager
kan injiceras som alla andra beroenden, t.ex. i AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Detta gör att du kan använda base.Redis
RedisClient-egenskap i dina ServiceStack-tjänster, t.ex.:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Om du använder base.Redis
du behöver inte uttryckligen göra dig av med RedisClienten eftersom den redan kasseras automatiskt av Tjänsten, dvs:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Du kan också injicera IRedisClientsManager
i dina egna klasser som alla andra beroenden med hjälp av en offentlig egendom eller konstruktorargument, t.ex.:
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();
}
}
Som du sedan kan registrera och koppla in i ServiceStacks IOC med:
container.RegisterAutoWired<RedisBarSetData>();
Vilket sedan låter dig använda det som ett beroende i dina tjänster:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Ett alternativ till att skapa din egen basklass är att ärva från den redan existerande LogicBase-basklassen, som redan har
IRedisClientsManager
fastighet och över pannplåt.