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!
            }
      }
    }

ServiceStack Redis 将具有空属性的对象添加到哈希

首先,

您应该真正避免在 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);