[英]Configuring JsonNetSerializer and JsonNetBodyDeserializer using Nancy TinyIoC
我是南希的菜鳥。 我一直在使用它作為生成REST API的框架。 我熟悉Json.NET所以我一直在玩Nancy.Serialization.JsonNet
包。
我的目標:自定義JsonNetSerializer
和JsonNetBodyDeserializer
的行為(即更改設置)。
具體來說,我想加入以下設置......
var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };
settings.Converters.Add( new StringEnumConverter { AllowIntegerValues = false, CamelCaseText = true } );
我想使用內置的TinyIoC容器執行此自定義,以避免繼承鏈並限制Nancy.Serialization.JsonNet
包中任何更改引起的潛在問題。
注意:作為臨時解決方法,我利用繼承來創建CustomJsonNetSerializer
和CustomJsonNetBodyDeserializer
。
我嘗試了幾種方法來至少為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)
構造函數。
潛在問題:我注意到構造函數被調用了兩次。 我沒想到這種行為。
第一次一切都很正確 - 我的自定義被添加並正確注冊。 但是,第二次發生並且類型被重新注冊,沒有設置自定義。 重新注冊似乎取代原始注冊失去我的設置自定義。
第二次調用構造函數時調用堆棧顯示它在GetEngine
和GetEngineInternal
期間被調用,它似乎試圖構建一個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:
使用此方法可使實現設置在使用JsonSerializer的任何位置保持一致。
問: 我可以從您概述的方法中正確推斷出我不再需要在CustomNancyBootstrapper中的ConfigureApplicationContainer覆蓋中顯式注冊CustomJsonSerializer嗎?
答:我為注冊完成的方法只是一個更清晰的注冊依賴項抽象,而不是制作一個巨大的Bootstrapper,你可以創建一些較小的特定類。
是的,使用我的方法意味着您不需要在引導程序中注冊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.