2017-02-05 5 views
2

protobuf-netとmediatRを統合しようとしています。 考え方は、ペイロードが到着する単一のエンドポイントを持つことです。 次に、リクエストメッセージをデシリアライズし、それをmediatRに渡す必要があります。これは、リクエストメッセージタイプに基づいて適切なハンドラに解決されるべきです。protobuf-netでシリアル化/逆シリアル化中に一般的な情報が失われる

すべてのリクエストはIRequestから継承されます。 結果ベースクラスとそれを継承する多くのコンクリートクラスがあります。 ように:

[ProtoContract] 
[ProtoInclude(10, typeof(CreateUserRequest))] 
[ProtoInclude(11, typeof(DeleteUserRequest))] 
[ProtoInclude(12, typeof(GetUserRequest))] 
[ProtoInclude(13, typeof(UpdateUserRequest))] 
[ProtoInclude(14, typeof(IRequest))] 


[ProtoInclude(19, typeof(IRequest<Response>))] 
[ProtoInclude(20, typeof(IRequest<CreateUserResponse>))] 
[ProtoInclude(21, typeof(IRequest<DeleteUserResponse>))] 
[ProtoInclude(22, typeof(IRequest<GetUserResponse>))] 
[ProtoInclude(23, typeof(IRequest<UpdateUserResponse>))] 
public class Request : IRequest<Response> 
{ 
    [ProtoMember(1)] 
    public Guid CorrelationId { get; set; } 

    [ProtoMember(2)] 
    public string Requestor { get; set; } 
} 


[ProtoContract] 
public class CreateUserRequest : Request, IRequest<CreateUserResponse> 
{ 
    [ProtoMember(1)] 
    public string UserName { get; set; } 
} 


public class CreateUserResponse : Response 
{ 
    [ProtoMember(1)] 
    public string NewUserName { get; set; } 
} 

問題は、私がいるProtobufでオブジェクトをシリアル化するとき、一般的な情報が失われている、です。 私はちょうど1つの場所で逆シリアル化をやっています(反射などを使って試しました)。 IRequest型のオブジェクトに逆シリアル化できません。

ジェネリックパラメータについての情報を保持する方法はありますか?そのため、CreateUserRequestだけでなく、IRequestタイプになるようにオブジェクトをデシリアライズできますか?

もちろん、うまくいけば、私は間違っているのですか?

答えて

0

「インクルード」機能は、インターフェイスではなくクラスで使用することを目的としています。説明しているのは、信頼できる反復可能な逆シリアル化オプションがないため、サポートされているシナリオではありません。基本的に、それがしようとしているのは、具体的なタイプを解決することです。 (実際にはモデルには言及されていませんが)すべてのが実装されている可能性がありますので、もっと混乱させてしまいます。

ただし、一般的な情報は失われません。あなたのタイプがCreateUserRequestのパスになっていることを知ることで、どのインタフェースが実装されているかをすでに知っています。それらは型定義に直接結び付けられています。

私はまだあなたがしようとしていることについて少し混乱していますが、コードはシリアル化パスを決定する際にインターフェイスを見ません。

関連する問題