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("[email protected]: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
IRedisClientsManager
heeft. eigendom en boven boilerplate.