U mag geen enkele instantie van RedisClient hebben of IRedisTypedClient<BarSet> die beide een niet-thread-veilige Redis TCP-verbinding inkapselen. U kunt in plaats daarvan singleton-instanties van IRedisClientsManager - wat het doel is om een thread-safe Redis Client Factory te bieden (zoals een DB Connection Pool).
Als u ook ServiceStack Services gebruikt, is het gemakkelijker om afhankelijkheden te registreren in het IOC van ServiceStack, dus IRedisClientsManager kan worden geïnjecteerd zoals elke andere afhankelijkheid, bijvoorbeeld in AppHost.Configure() :
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("example@sqldat.com:6379"));
Hiermee kunt u de base.Redis . gebruiken RedisClient-eigenschap in uw ServiceStack Services, bijvoorbeeld:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Als u base.Redis . gebruikt u hoeft de RedisClient niet expliciet te verwijderen, aangezien deze al automatisch wordt verwijderd door de Service, d.w.z.:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
U kunt ook IRedisClientsManager . injecteren in uw eigen klassen zoals elke andere afhankelijkheid met behulp van een openbare eigenschap of Constructor-argument, bijvoorbeeld:
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();
}
}
Die u vervolgens kunt registreren en autowiren in ServiceStack's IOC met:
container.RegisterAutoWired<RedisBarSetData>();
Waardoor je het dan als een afhankelijkheid in je Services kunt gebruiken:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Een alternatief voor het maken van uw eigen basisklasse is om te erven van de reeds bestaande LogicBase-basisklasse, die al
IRedisClientsManagerheeft. eigendom en boven boilerplate.