您不应持有
RedisClient或
IRedisTypedClient<BarSet>封装了非线程安全的Redis
TCP连接的任何单例实例。相反,您可以保留-的单例实例,
IRedisClientsManager这是提供线程安全的Redis Client
Factory(如数据库连接池)的目的。
如果您还使用ServiceStack
Services,则在ServiceStack的IOC中注册依赖项会更容易,因此
IRedisClientsManager可以像其他任何依赖项一样注入,例如
AppHost.Configure():
container.Register<IRedisClientsManager>(c => new BasicRedisClientManager("mypassword@localhost:6379"));这将允许您
base.Redis在ServiceStack Services中使用RedisClient属性,例如:
public class JmaSetsService : Service{ public object Get(JmaSets request) { var redisBarSets = base.Redis.As<BarSet>(); return redisBarSets.Lists[instument_key].GetAll(); }}如果您使用
base.Redis,则不必显式处理RedisClient,因为它已经
由Service自动处理,即:
public class Service{ ... public virtual void Dispose() { if (redis != null) redis.Dispose(); ... }}您还可以
IRedisClientsManager像其他任何依赖项一样,使用公共属性或Constructor参数将其注入自己的类中,例如:
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(); }}然后,您可以使用以下方法在ServiceStack的IOC中进行注册和自动连线:
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属性并且位于样板之上。



