Bạn không nên giữ bất kỳ phiên bản nào của RedisClient
hoặc IRedisTypedClient<BarSet>
mà cả hai đều đóng gói Kết nối Redis TCP không an toàn theo luồng. Thay vào đó, bạn có thể giữ các bản sao đơn lẻ của IRedisClientsManager
- mục đích của nó là cung cấp một Nhà máy khách hàng Redis an toàn theo luồng (như Nhóm kết nối DB).
Nếu bạn cũng đang sử dụng Dịch vụ ServiceStack, thì việc đăng ký các phần phụ thuộc trong IOC của ServiceStack sẽ dễ dàng hơn vì vậy IRedisClientsManager
có thể được đưa vào giống như bất kỳ phần phụ thuộc nào khác, ví dụ:trong AppHost.Configure()
:
container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Điều này sẽ cho phép bạn sử dụng base.Redis
Thuộc tính RedisClient trong Dịch vụ ServiceStack của bạn, ví dụ:
public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Nếu bạn sử dụng base.Redis
bạn không cần phải hủy bỏ RedisClient một cách rõ ràng vì nó đã được Dịch vụ xử lý tự động, tức là:
public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Bạn cũng có thể đưa vào IRedisClientsManager
vào các lớp của riêng bạn giống như bất kỳ phụ thuộc nào khác bằng cách sử dụng thuộc tính công khai hoặc đối số Khối mã lệnh, ví dụ:
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();
}
}
Sau đó, bạn có thể đăng ký và tự động truy cập vào IOC của ServiceStack với:
container.RegisterAutoWired<RedisBarSetData>();
Sau đó, điều này sẽ cho phép bạn sử dụng nó như một phần phụ thuộc vào Dịch vụ của bạn:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Một giải pháp thay thế cho việc tạo lớp cơ sở của riêng bạn là kế thừa từ lớp cơ sở LogicBase đã có từ trước, lớp này đã có
IRedisClientsManager
thuộc tính và bảng định vị bên trên.