Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Nancy TinyIoC配置JsonNetSerializer和JSonnetBodySerializer_C#_Json.net_Nancy_Tinyioc - Fatal编程技术网

C# 使用Nancy TinyIoC配置JsonNetSerializer和JSonnetBodySerializer

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

我是南希的不速之客。我一直在使用它作为框架来生成RESTAPI。我熟悉Json.NET,所以一直在使用
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。