簡體   English   中英

使用Nancy TinyIoC配置JsonNetSerializer和JsonNetBodyDeserializer

[英]Configuring JsonNetSerializer and JsonNetBodyDeserializer using Nancy TinyIoC

我是南希的菜鳥。 我一直在使用它作為生成REST API的框架。 我熟悉Json.NET所以我一直在玩Nancy.Serialization.JsonNet包。

我的目標:自定義JsonNetSerializerJsonNetBodyDeserializer的行為(即更改設置)。

具體來說,我想加入以下設置......

var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };
settings.Converters.Add( new StringEnumConverter { AllowIntegerValues = false, CamelCaseText = true } );

我想使用內置的TinyIoC容器執行此自定義,以避免繼承鏈並限制Nancy.Serialization.JsonNet包中任何更改引起的潛在問題。

注意:作為臨時解決方法,我利用繼承來創建CustomJsonNetSerializerCustomJsonNetBodyDeserializer

我嘗試了幾種方法來至少為JsonNetSerializer整合這種配置。 我還沒有嘗試配置JsonNetBodyDeserializer使用TinyIoC呢。 我想它會以同樣的方式完成。 我嘗試過的所有工作都在我的CustomNancyBootstrapper (它繼承自DefaultNancyBootstrapper )中。

到目前為止最成功的方法:覆蓋ConfigureApplicationContainer

protected override void ConfigureApplicationContainer( TinyIoCContainer container )
{
    base.ConfigureApplicationContainer( container );

    // probably don't need both registrations, and I've tried only keeping one or the other
    var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };
    settings.Converters.Add( new StringEnumConverter { AllowIntegerValues = false, CamelCaseText = true } );
    container.Register( new JsonNetSerializer( JsonSerializer.CreateDefault( settings ) ) );
    container.Register<ISerializer>( new JsonNetSerializer( JsonSerializer.CreateDefault( settings ) ) );
}

我已經跟蹤了代碼並在JsonNet包中觀察了JsonNetSerializer(JsonSerializer serializer)構造函數。

潛在問題:我注意到構造函數被調用了兩次。 我沒想到這種行為。

第一次一切都很正確 - 我的自定義被添加並正確注冊。 但是,第二次發生並且類型被重新注冊,沒有設置自定義。 重新注冊似乎取代原始注冊失去我的設置自定義。

第二次調用構造函數時調用堆棧顯示它在GetEngineGetEngineInternal期間被調用,它似乎試圖構建一個NancyEngine (我正在使用自主程序包,所以這發生在program.cs中 - using(var host = new NancyHost(uri)) )。

好像我需要告訴Nancy不要做某事或者我需要掛鈎到鏈中的后續部分。

任何幫助,將不勝感激。

通常,在Nancy中解決這個問題的方法是實現自己的JSON Serializer,如下所示:

public sealed class CustomJsonSerializer : JsonSerializer
{
    public CustomJsonSerializer()
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver();
        Converters.Add(new StringEnumConverter
        {
            AllowIntegerValues = false, 
            CamelCaseText = true
        });
        Formatting = Formatting.Indented;
    }
}

在這里,您可以覆蓋所有設置。

然后你可以注冊它,我通過使用IRegistrations這樣做

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; }
}

問: 這種方法與創建從JsonNetSerializer繼承的CustomJsonNetSerializer,然后在ConfigureApplicationContainer(container.Register(typeof(JsonNetSerializer),typeof(CustomJsonNetSerializer))中注冊它有何不同?

答: JsonSerializer是jancy.net for Nancy的實現,這是我們在github上自述文件中定義的推薦方法:

https://github.com/NancyFx/Nancy.Serialization.JsonNet#customization

你提到的類是JSON對象的序列化,還有另一個處理反序列化的類,它們都在內部使用JsonSerializer:

https://github.com/NancyFx/Nancy.Serialization.JsonNet/blob/master/src/Nancy.Serialization.JsonNet/JsonNetSerializer.cs#L10

使用此方法可使實現設置在使用JsonSerializer的任何位置保持一致。

問: 我可以從您概述的方法中正確推斷出我不再需要在CustomNancyBootstrapper中的ConfigureApplicationContainer覆蓋中顯式注冊CustomJsonSerializer嗎?

答:我為注冊完成的方法只是一個更清晰的注冊依賴項抽象,而不是制作一個巨大的Bootstrapper,你可以創建一些較小的特定類。

是的,使用我的方法意味着您不需要在引導程序中注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM