ServiceStack Redis将具有null属性的对象添加到Hash

时间:2014-11-18 18:52:59

标签: c# servicestack servicestack.redis

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

有人能指出正确的方法来做我想做的事情吗?在这种情况下, 将对象存储为redis哈希,同时将某些属性设置为null。 < / p>

以下是显示问题的摘录:

    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!

            }

      }

    }

1 个答案:

答案 0 :(得分:1)

首先,您应该avoid using interfaces on DTO's这是序列化过程中常见问题的根源。

此外,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();

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

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

使用错误的类型,即SomeClass vs ISomeInterface也是如此。

RedisClient上也提供StoreAsHash API,例如:

redisClient.StoreAsHash(objectToSendToHash);  
相关问题