Не трябва да държите никакви единични екземпляри на RedisClient
или IRedisTypedClient<BarSet>
който и двете капсулира небезопасна за нишки Redis TCP връзка. Вместо това можете да задържите единични екземпляри на IRedisClientsManager
- което е целта му да осигури безопасен за нишки Redis Client Factory (като DB Connection Pool).
Ако използвате и ServiceStack Services, е по-лесно да регистрирате зависимости в IOC на ServiceStack, така че IRedisClientsManager
може да се инжектира като всяка друга зависимост, например в AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Това ще ви позволи да използвате base.Redis
Свойството RedisClient във вашите ServiceStack Services, напр.:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Ако използвате base.Redis
не е нужно изрично да изхвърляте RedisClient, тъй като той вече е автоматично изхвърлен от Услугата, т.е.:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Можете също да инжектирате IRedisClientsManager
във вашите собствени класове като всяка друга зависимост, използваща публично свойство или аргумент на конструктора, напр.:
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();
}
}
Което след това можете да регистрирате и автоматично да свържете в IOC на ServiceStack с:
container.RegisterAutoWired<RedisBarSetData>();
Което след това ще ви позволи да го използвате като зависимост във вашите Услуги:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Алтернатива на създаването на свой собствен базов клас е да наследите от вече съществуващия базов клас LogicBase, който вече има
IRedisClientsManager
собственост и над шаблона.