0

我正在尝试使用 ServiceStack 将对象添加到 redis 哈希。但是,当我尝试发送到 redis 哈希的对象之一具有 null 属性时,它会中断,获取未设置为 String 异常实例的 String 引用。

有人可以指出正确的方法来做我想做的事,在这种情况下,将一个对象存储为 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!

            }

      }

    }
4

1 回答 1

1

首先,您应该真正避免在 DTO 上使用接口,这是序列化过程中常见的问题来源。

此外,StoreAsHashAPI 将您的类型转换为键/值字典并将每个属性存储在 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();

请注意,我们没有理由使用 Typed RedisClient StoreAsHash,即

var redis = redisClient.As<ISomeInterface>();

这看起来也使用了错误的类型,即SomeClassvs ISomeInterface

StoreAsHashAPI 也可在 RedisClient 上使用,例如:

redisClient.StoreAsHash(objectToSendToHash);  
于 2014-11-18T20:53:00.067 回答