配置JsonNetSerializer使用南希TinyIoC JsonNetBodyDeserializer [英] Configuring JsonNetSerializer and JsonNetBodyDeserializer using Nancy TinyIoC

查看:429
本文介绍了配置JsonNetSerializer使用南希TinyIoC JsonNetBodyDeserializer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一个小白南希。我一直在使用它作为一个框架,以产生一个REST API。我所熟悉的Json.NET,所以我一直在玩的 Nancy.Serialization.JsonNet 包。

I am a noob to Nancy. I have been using it as a framework to produce a REST API. I am familiar with Json.NET so I've been playing with the Nancy.Serialization.JsonNet package.

我的目标:自定义行为(即更改设置)的 JsonNetSerializer JsonNetBodyDeserializer

My goal: to customize the behavior (i.e. change the settings) of the JsonNetSerializer and JsonNetBodyDeserializer.

我特别想包含以下设置...

Specifically I'd like to incorporate the following settings...

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

I have tried several approaches to incorporate this configuration at least for the JsonNetSerializer. I've not tried configuring the JsonNetBodyDeserializer using the TinyIoC yet. I imagine it will be done similarly. All the work I've tried is in my CustomNancyBootstrapper (which inherits from DefaultNancyBootstrapper).

最成功的方法至今:覆盖 ConfigureApplicationContainer

Most successful approach so far: override 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串行)在JsonNet包构造

潜在的问题:我注意到构造函数被调用两次。没想到这一行为。

Potential problem: I noticed the constructor is called twice. I did not expect this behavior.

第一次一切都刚刚好 - 我的定制添加和正确注册。但是,则第二时间发生和类型都重新登记,没有设置的定制。重新注册出现,以取代原登记失去了我的设置,自定义设置。

The first time everything is just right - my customization is added and registered properly. But, then the second time happens and the types are re-registered, without the settings customization. The re-registration appears to replace the original registration losing my settings customization.

调用堆栈中的第二次调用构造函数表明,它在<$ C $称为C> GetEngine 和 GetEngineInternal 这似乎试图建立一个 NancyEngine (我用自主机包,以便这种情况发生在Program.cs中 - 使用(VAR主机=新NancyHost(URI))

The call stack the second time the constructor is called shows that it is called during GetEngine and GetEngineInternal which seems to try to build a NancyEngine (I am using the self-host package so this happens in program.cs -- using(var host = new NancyHost(uri)) ).

好像我不是要告诉南希不要做某件事,或者我需要挂钩到链中稍后的一部分。

Seems like I either need to tell Nancy not to do something or I need to hook in to a later part in the chain.

任何帮助将是。欣赏

推荐答案

一般来说,在南希来解决这个问题的方法是实现自己的JSON序列化,像这样:

Typically the way to solve this in Nancy is to implement your own JSON Serializer like so:

public sealed class CustomJsonSerializer : JsonSerializer
{
    public CustomJsonSerializer()
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver();
        Converters.Add(new StringEnumConverter
        {
            AllowIntegerValues = false, 
            CamelCaseText = true
        });
        Formatting = Formatting.Indented;
    }
}



在这里,您可以覆盖所有设置。

Here you can override all the settings.

然后你可以使用 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; }
}

问: 如何做到这一点办法从创建CustomJsonNetSerializer从JsonNetSerializer继承,然后在ConfigureApplicationContainer(container.Register(typeof运算(JsonNetSerializer)的typeof(CustomJsonNetSerializer))注册它有什么不同?

< STRONG>答:的JsonSerializer是执行,如果json.net南希,这是我们定义在GitHub上的自述推荐的方法:

A: The JsonSerializer is the implementation if json.net for Nancy, this is the recommended method we define on the readme on github:

<一个HREF =https://github.com/NancyFx/Nancy.Serialization.JsonNet#customization> https://github.com/NancyFx/Nancy.Serialization.JsonNet#customization

你提到的类是对象到JSON的序列化,还有一个负责处理反序列化,这两者利用JsonSerializer内部:

The class you mention is the serialization of an object to JSON, there is another which handles deserialization, both of which utilize JsonSerializer internally:

https://github.com/NancyFx/ Nancy.Serialization.JsonNet / BLOB /主/ src目录/ Nancy.Serialization.JsonNet / JsonNetSerializer.cs#L10

使用这种方法使执行设置保持一致任何地方,该JsonSerializer被使用。

Using this method makes the implementation settings consistent anywhere that the JsonSerializer is used.

问: 我能正确地从你介绍,我将不再需要在明确注册CustomJsonSerializer的做法推断?ConfigureApplicationContainer覆盖在我的CustomNancyBootstrapper

答:我已经登记完成的方法只是用于注册依赖清洁抽象,而不是使一个巨大的引导程序,你可以创建一个小一些特定的类。

A: The method I've done for registering is just a cleaner abstraction for registering dependencies, rather than making one giant Bootstrapper, you can create a few smaller specific classes.

使用我的方法是意味着你不需要引导程序进行注册。

Yes using my method means you do not need to register in the bootstrapper.

这篇关于配置JsonNetSerializer使用南希TinyIoC JsonNetBodyDeserializer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆