ServiceStack Redis 将具有空属性的对象添加到哈希
本文关键字:对象 添加 哈希 属性 Redis ServiceStack | 更新日期: 2023-09-27 18:30:46
我正在尝试使用 ServiceStack 将对象添加到 redis 哈希中。但是,当我尝试发送到 redis 哈希的一个对象具有 null 属性时,它会中断,从而获得未设置为字符串异常实例的字符串引用。
有人可以指出正确的方法来做我想做的事情,在这种情况下,将对象存储为 redis 哈希,同时将某些属性设置为 null。
以下是显示该问题的代码片段:
public interface SomeInterface
{
string Id {get;set;}
string Name {get;set;}
DateTime? DateScheduled {get;set;}
DateTime? DateUnscheduled {get;set;}
ISomeInterface SomeNeededObject {get;set};
}
public class SomeClass : SomeInterface
{
public string Id {get;set;
public string Name {get;set;}
public DateTime? DateScheduled {get;set;}
public DateTime? DateUnscheduled {get;set;}
public ISomeInterface SomeNeededObject {get;set};
// Other useful properties/methods
}
public class SomeService :Service
{
public void SomeMethod( ISomeInterface objectToSendToHash)
{
SomeClass c = new SomeClass()
{
Id = "1",
Name = "Name1",
DateScheduled = DateTime.Now
}; // creates a SomeClass with DateUnscheduled and SomeNeededObject properties set to null
using (IRedisClient redisClient = this.MyRedisClient)
{
var redis = redisClient.As<ISomeInterface>();
redis.StoreAsHash(objectToSendToHash); //throws exception because either DateUnscheduled, or SomeNeededObject properties are null!
}
}
}
首先,
您应该真正避免在 DTO 上使用接口,这是序列化过程中问题的常见来源。
此外,StoreAsHash
API 将您的类型转换为键/值字典,并将每个属性存储在 redis 哈希中,因此您只能将其与基本 Poco 类型一起使用(即不与嵌套复杂类型一起使用)。
我已经清理了您的源代码示例以删除所有命名和语法错误,以下示例确实按预期工作:
public interface ISomeInterface
{
string Id { get; set; }
string Name { get; set; }
DateTime? DateScheduled { get; set; }
DateTime? DateUnscheduled { get; set; }
ISomeInterface SomeNeededObject { get; set; }
}
public class SomeClass : ISomeInterface
{
public string Id { get; set; }
public string Name { get; set; }
public DateTime? DateScheduled { get; set; }
public DateTime? DateUnscheduled { get; set; }
public ISomeInterface SomeNeededObject { get; set; }
}
var c = new SomeClass
{
Id = "1",
Name = "Name1",
DateScheduled = DateTime.Now,
};
Redis.StoreAsHash(c);
var fromHash = Redis.GetFromHash<SomeClass>("1");
fromHash.PrintDump();
请注意,我们没有理由使用类型化 RedisClient 来使用StoreAsHash
,即
var redis = redisClient.As<ISomeInterface>();
看起来它也使用了错误的类型,即 SomeClass
vs ISomeInterface
.
StoreAsHash
API 也可在 RedisClient 上使用,例如:
redisClient.StoreAsHash(objectToSendToHash);