0

入力の一部として要求された URL を使用する Nancy モジュールのカスタム シリアル化を使用したいと考えています。

ConfigureRequestContainer のオーバーライドでコンテキストを使用する依存関係を登録する必要があることを見てきました ( C# IOC および Request State in NancyFX で回答されているように)

public class NancyBootstrapper : DefaultNancyBootstrapper
{
    protected override void ConfigureRequestContainer(
        TinyIoCContainer container, 
        NancyContext context)
    {
        container.Register<JsonSerializer>(new CustomJsonSerializer(context));
    }
}

そして、 IRegistrations インターフェースを使用してナンシーに別のシリアライザーを指定できることを見てきました ( Nancy TinyIoC を使用した JsonNetSerializer および JsonNetBodyDeserializer の構成で回答されているように)

public class JsonRegistration : IRegistrations
{
    public IEnumerable<TypeRegistration> TypeRegistrations
    {
        get
        {
           yield return new TypeRegistration(typeof(JsonSerializer), typeof(CustomJsonSerializer));
        }
    }

    public IEnumerable<CollectionTypeRegistration> CollectionTypeRegistrations { get; protected set; }
    public IEnumerable<InstanceRegistration> InstanceRegistrations { get; protected set; }
}

最初の方法でシリアライザーを登録すると、Nancy に JSON シリアライゼーションに使用させることができません。

2 番目の方法で登録すると、現在の NancyContext のコピーを挿入してリクエストにアクセスできなくなります。メソッドが呼び出される前に、シリアライザーのインスタンスを作成しようとします。ConfigureRequestContainer

ここで何が欠けていますか?

4

1 に答える 1

1

「シリアライゼーション」部分に興味があると仮定すると、つまり、モデルをjsonとして返す場合、モデルを拡張してパイプラインを介して必要な情報を運び、シリアライザーがそれを取り除くことを検討しましたか?

次のコードは、カスタム シリアライザーが十分にスマートで、null プロパティをシリアル化しないことを前提としています。

Get["/somedata"] = _ => new MyModelEx
   { 
      WhateverRealProperty = "some data",
      RequestUri = this.Context.Request.Uri
   };

public class MyModelEx : MyModel, IModelWithRequestUri
{
    public string RequestUri {get; set;}
}

そしてシリアライザーでは、この「余分な」データ要素をテストし、そこから必要なものを取得し、それを取り除き (null に設定しますか??)、残りをシリアル化できます。

または、上記のバリエーションで、次のような「コンテナ」ジェネリックモデルを使用できます

public class ExtendedModel<T>
{
    public T Model {get; set;}
    public string RequestUri {get;set;} // or even pass the whole context if u need to
}

上記のいくつかのバリエーションは、最も単純な実装です。

現在のコンテキストを保持するリクエストごとの「バッグ」の何らかの形式を作成し、そのバッグをシリアライザーに挿入する別のアプローチをお勧めします(もちろん、これにはシリアライザーを登録する必要があります) -リクエストも)。

アイデアについては、この回答を確認してください。

于 2015-07-07T00:01:43.007 に答える