1

List を返す ServiceStack を使用して Web サービスを作成しました<SyncUserDTO>。より多くのプロパティがありますが、Timestamp という 1 つのフィールドに単純化しました。

[DataContract]
public class SyncUserDTO
{
    public SyncUserDTO()
    {
        Timestamp = new TimestampDTO();
    }

    [DataMember(Order = 1)]
    public TimestampDTO Timestamp { get; set; }
}

[DataContract]
public class TimestampDTO
{
    [DataMember]
    public bool DataValid { get; set; }
    [DataMember]
    public DateTime? Value { get; set; }
}

このサービスは (他のテストでは) 完全に動作しているように見えますが、クライアント コンソール アプリケーションを作成してサービス参照を追加すると、SyncUserDTO にコンストラクターがないため、動作しません。

static void SendUsersServiceReference()
{
    var users = new List<SyncUserDTO>();
    for (var i = 0; i < 5; i++) 
    {
        var user = new SyncUserDTO();

        user.Timestamp.Value = DateTime.Now;  // NullReferenceException, 
        user.Timestamp.DataValid = true;      //   as Timestamp is null
    }
}

SyncUserDTO で F12 キーを押すと、Reference.cs にコンストラクター メソッドが見つからないようで、上記が機能しない理由を説明しています。

しかし、クライアント アプリケーションのプロキシ クラスにコンストラクターが作成されないのはなぜですか?

クライアントで自分で「構築」を行う必要があり、それが機能します:

       var user = new SyncUserDTO() { Timestamp = new TimestampDTO() };

もちろん、私のサービスを利用する人が自分で作成する必要はありません。彼らは、基礎となる TimestampDTO に注意を払う必要があります。コンストラクターはこれを行う必要があります。

ところで、私はGoogleとSOを検索して、「サービス参照を追加してプロキシクラスで作成されたコンストラクターではありません」などの用語を「ServiceStack」の有無にかかわらず検索しましたが、このクエストで私を助ける結果はありません...

pps。Demis (ServiceStack) さん、あなたがこれを読んでいるなら、そうです、SOAP は消えつつあります。REST は新しい闇です。しかし、私は両方をサポートしたいと考えています。私はServiceStackが大好きです:D

4

3 に答える 3

1

プロパティにアクセスするまでにインスタンス化を試みてください。回避策であることはわかっていますが、シナリオでは便利な場合があります。

private TimestampDTO  _timestamp;
public TimestampDTO Timestamp 
{
    get
    {
       if(_timestamp==null) _timestamp=new TimestampDTO();
       return _timestamp;
    }
    set
    {
       _Timestamp=value;
     }
}
于 2013-10-18T13:52:05.387 に答える