Du bør ikke have nogen singleton-forekomster af RedisClient
eller IRedisTypedClient<BarSet>
som begge indkapsler en ikke-trådsikker Redis TCP-forbindelse. Du kan i stedet holde singleton-forekomster af IRedisClientsManager
- hvilket er dets formål at give en trådsikker Redis Client Factory (som en DB Connection Pool).
Hvis du også bruger ServiceStack Services, er det nemmere at registrere afhængigheder i ServiceStack's IOC, så IRedisClientsManager
kan injiceres som enhver anden afhængighed, f.eks. i AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Dette giver dig mulighed for at bruge base.Redis
RedisClient-egenskab i dine ServiceStack-tjenester, f.eks.:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Hvis du bruger base.Redis
du behøver ikke eksplicit at bortskaffe RedisClienten, da den allerede automatisk bortskaffes af Tjenesten, dvs.:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Du kan også injicere IRedisClientsManager
ind i dine egne klasser som enhver anden afhængighed ved hjælp af en offentlig ejendoms- eller Constructor-argument, f.eks.:
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 så kan registrere og autowire i ServiceStack's IOC med:
container.RegisterAutoWired<RedisBarSetData>();
Hvilket så vil lade dig bruge det som en afhængighed i dine tjenester:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Et alternativ til at oprette din egen basisklasse er at arve fra den allerede eksisterende LogicBase-basisklasse, som allerede har IRedisClientsManager
ejendom og over kedelplade.