Sie sollten keine Singleton-Instanzen von RedisClient
halten oder IRedisTypedClient<BarSet>
die beide eine nicht threadsichere Redis-TCP-Verbindung kapseln. Sie können stattdessen Singleton-Instanzen von IRedisClientsManager
halten - was der Zweck ist, eine Thread-sichere Redis-Client-Factory (wie einen DB-Verbindungspool) bereitzustellen.
Wenn Sie auch ServiceStack-Dienste verwenden, ist es einfacher, Abhängigkeiten im IOC von ServiceStack zu registrieren, also IRedisClientsManager
kann wie jede andere Abhängigkeit eingefügt werden, z. B. in AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Dadurch können Sie base.Redis
verwenden RedisClient-Eigenschaft in Ihren ServiceStack-Diensten, z. B.:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Wenn Sie base.Redis
verwenden Sie müssen den RedisClient nicht explizit entsorgen, da er bereits automatisch vom Dienst entsorgt wird, d. h.:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Sie können auch IRedisClientsManager
einfügen in Ihre eigenen Klassen wie jede andere Abhängigkeit mit einer öffentlichen Eigenschaft oder einem Konstruktorargument, z. B.:
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 Sie dann im IOC von ServiceStack registrieren und automatisch verdrahten können mit:
container.RegisterAutoWired<RedisBarSetData>();
Dadurch können Sie es dann als Abhängigkeit in Ihren Diensten verwenden:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Eine Alternative zum Erstellen Ihrer eigenen Basisklasse besteht darin, von der bereits vorhandenen LogicBase-Basisklasse zu erben, die bereits über IRedisClientsManager
verfügt Eigentum und über Boilerplate.