我是Nancy的新手。 我一直在使用它作为框架来生成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
中。 我还没有尝试使用TinyIoC配置JsonNetBodyDeserializer
。 我想它会类似地完成。 我所尝试的所有工作都在我的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(我正在使用self-host包,所以这在program.cs中发生--using(var host = new NancyHost(uri)))。
似乎我需要告诉Nancy不要做某些事情,或者我需要钩入到链中的后面部分。
任何帮助将不胜感激。