我是南希的菜鸟。我一直将它用作生成 REST API 的框架。我熟悉 Json.NET,所以我一直在玩这个Nancy.Serialization.JsonNet
包。
JsonNetSerializer
我的目标:自定义and的行为(即更改设置)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 ) ) );
}
我已经跟踪了代码并观察JsonNetSerializer(JsonSerializer serializer)
了 JsonNet 包中的构造函数。
潜在问题:我注意到构造函数被调用了两次。我没想到会有这种行为。
第一次一切都恰到好处 - 我的自定义已正确添加和注册。但是,第二次发生并且类型被重新注册,没有设置自定义。重新注册似乎取代了失去我的设置自定义的原始注册。
第二次调用构造函数时的调用堆栈显示它在期间被调用,GetEngine
并且GetEngineInternal
似乎试图构建一个NancyEngine
(我正在使用自托管包,所以这发生在 program.cs -- using(var host = new NancyHost(uri))
)。
似乎我要么需要告诉南希不要做某事,要么我需要加入链条的后面部分。
任何帮助,将不胜感激。