你不应该持有任何单例实例RedisClient
or IRedisTypedClient<BarSet>
它们都封装了一个非线程安全的 Redis TCP 连接。您可以改为保存单例实例IRedisClientsManager
- 其目的是提供线程安全的 Redis 客户端工厂(如数据库连接池)。
如果您还使用 ServiceStack 服务,则在 ServiceStack 的 IOC 中注册依赖项会更容易,因此IRedisClientsManager
可以像任何其他依赖项一样注入,例如AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("mypassword@localhost:6379"));
这将允许您使用base.Redis
ServiceStack 服务中的 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,因为它已经由服务自动处置 https://github.com/ServiceStack/ServiceStack/blob/02a00d75438e40892e095389ea303838d91e9d8d/src/ServiceStack/Service.cs#L163, i.e:
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();
}
}
然后您可以在 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));
}
}
创建自己的基类的另一种方法是从预先存在的基类继承逻辑库 https://github.com/ServiceStack/ServiceStack/blob/02a00d75438e40892e095389ea303838d91e9d8d/src/ServiceStack/ILogic.cs#L55基类,已经有IRedisClientsManager
属性及以上样板。