C# 使用Nancy TinyIoC配置JsonNetSerializer和JSonnetBodySerializer
我是南希的不速之客。我一直在使用它作为框架来生成RESTAPI。我熟悉Json.NET,所以一直在使用C# 使用Nancy TinyIoC配置JsonNetSerializer和JSonnetBodySerializer,c#,json.net,nancy,tinyioc,C#,Json.net,Nancy,Tinyioc,我是南希的不速之客。我一直在使用它作为框架来生成RESTAPI。我熟悉Json.NET,所以一直在使用Nancy.Serialization.JsonNet包 我的目标:自定义JsonNetSerializer和jsonnetbodyserializer的行为(即更改设置) 具体来说,我想合并以下设置 var settings = new JsonSerializerSettings { Formatting = Formatting.Indented }; settings.Converter
Nancy.Serialization.JsonNet
包
我的目标:自定义JsonNetSerializer
和jsonnetbodyserializer
的行为(即更改设置)
具体来说,我想合并以下设置
var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };
settings.Converters.Add( new StringEnumConverter { AllowIntegerValues = false, CamelCaseText = true } );
我希望使用内置的TinyIoC容器执行此定制,以避免继承链,并限制由Nancy.Serialization.JsonNet
包中的任何更改引起的潜在问题
注意:作为一种临时解决方法,我利用继承来创建CustomJsonNetSerializer
和customjsonnetbodyserializer
我尝试了几种方法来合并此配置,至少对于JsonNetSerializer
。我还没有尝试使用TinyIoC配置jsonnetbodyserializer
。我想也会这样做。我尝试的所有工作都在我的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 ) ) );
}
受保护的覆盖无效配置应用程序容器(TinyIoCContainer)
{
基本配置应用程序容器(容器);
//可能不需要两个注册,我也试着只保留其中一个
var settings=newjsonserializersettings{Formatting=Formatting.Indented};
settings.Converters.Add(新的StringEnumConverter{AllowEnterValues=false,CamelCaseText=true});
Register(新的JsonNetSerializer(JsonSerializer.CreateDefault(设置));
Register(新的JsonNetSerializer(JsonSerializer.CreateDefault(设置));
}
我跟踪了代码并观看了JsonNet包中的JsonNetSerializer(JsonSerializer serializer)
构造函数
潜在问题:我注意到构造函数被调用了两次。我没想到会有这种行为
第一次一切都刚刚好-我的自定义添加和注册正确。但是,第二次发生时,将重新注册类型,而不进行设置自定义。重新注册似乎取代了原始注册,失去了“我的设置”自定义
第二次调用构造函数时的调用堆栈显示,它在GetEngine
和GetEngineInternal
期间被调用,这似乎试图构建一个NancyEngine
(我使用的是自主机包,因此这在program.cs中发生--使用(var host=new NancyHost(uri))
)
看来我要么要告诉南希不要做什么,要么我要插手后面的事情
任何帮助都将不胜感激。在Nancy中解决此问题的通常方法是实现您自己的JSON序列化程序,如下所示:
public sealed class CustomJsonSerializer : JsonSerializer
{
public CustomJsonSerializer()
{
ContractResolver = new CamelCasePropertyNamesContractResolver();
Converters.Add(new StringEnumConverter
{
AllowIntegerValues = false,
CamelCaseText = true
});
Formatting = Formatting.Indented;
}
}
在这里,您可以覆盖所有设置
然后您可以注册它,我使用I注册来注册
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; }
}
公共类json注册:i注册
{
公共IEnumerable类型注册
{
得到
{
返回新的TypeRegistration(typeof(JsonSerializer)、typeof(CustomJsonSerializer));
}
}
公共IEnumerable CollectionTypeRegistrations{get;protected set;}
公共IEnumerable InstanceRegistrations{get;protected set;}
}
Q:这种方法与创建从JSONETSerializer继承的CustomJSONETSerializer,然后在ConfigureApplicationContainer(container.Register(typeof(JSONETSerializer),typeof(CustomJSONETSerializer))中注册它有何不同
A:JsonSerializer是json.net for Nancy的实现,这是我们在github自述文件中定义的推荐方法:
您提到的类是JSON对象的序列化,还有一个类处理反序列化,这两个类都在内部使用JsonSerializer:
使用此方法可以使使用JsonSerializer的任何地方的实现设置保持一致
Q:根据您概述的方法,我是否可以正确推断,我不再需要在CustomNancyBootTrapper中的ConfigureApplicationContainer覆盖中显式注册CustomJsonSerializer
A:我所做的注册方法只是注册依赖项的一个更清晰的抽象,而不是制作一个巨大的引导程序,您可以创建一些较小的特定类
是的,使用我的方法意味着您不需要在引导程序中注册。有趣!从我的跟踪中,CollectionTypeRegistrations是我丢失自定义设置的地方。在尝试此方法之前,有两个问题。此方法与创建CustomJsonNetSerializer(继承自JsonNetSerializer,然后在Con中注册)有何不同图1应用程序容器(容器寄存器(typeof(JsonNetSerializer)、typeof(CustomJsonNetSerializer))?第二个问题,我是否可以从您概述的方法中正确推断,我不再需要在CustomNancyBootTrapper中的ConfigureApplicationContainer覆盖中显式注册CustomJsonSerializer?回答中回答了您的问题:)真棒的洞察力,巨大的帮助…谢谢Phill!!似乎不再工作了。自定义json序列化程序上的构造函数在注册后从未被调用。Nancy是一个黑匣子…@SergeyAkopov听起来像是在配置完所有内容后调用基类,所以注册被覆盖。基本上。PEBKAC。