0

ServiceStack を使用して redis ハッシュにオブジェクトを追加しようとしています。ただし、redis ハッシュに送信しようとしているオブジェクトの 1 つに 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!

            }

      }

    }
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 に答える