使用 Nancy TinyIoC 配置 JsonNetSerializer 和 JsonNetBodyDeserializer

2023-11-27

我对南希来说是个菜鸟。我一直使用它作为生成 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 and 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 and GetEngineInternal这似乎试图建立一个NancyEngine(我正在使用自主机包,所以这发生在program.cs中——using(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;
    }
}

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

然后你就可以注册它,我通过使用来做到这一点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; }
}

Q: 这种方法与创建继承自 JsonNetSerializer 的 CustomJsonNetSerializer 然后将其注册到ConfigureApplicationContainer (container.Register( typeof(JsonNetSerializer), typeof(CustomJsonNetSerializer) ) 中有何不同?

A:JsonSerializer 是 Nancy 的 json.net 实现,这是我们在 github 上的自述文件中定义的推荐方法:

https://github.com/NancyFx/Nancy.Serialization.JsonNet#customization

您提到的类是将对象序列化为 JSON,还有另一个处理反序列化,这两个类都在内部使用 JsonSerializer:

https://github.com/NancyFx/Nancy.Serialization.JsonNet/blob/master/src/Nancy.Serialization.JsonNet/JsonNetSerializer.cs#L10

使用此方法可以使使用 JsonSerializer 的任何地方的实现设置保持一致。

Q: 我能否从您概述的方法中正确推断出我不再需要在 CustomNancyBootstrapper 的 ConfigureApplicationContainer 覆盖中显式注册 CustomJsonSerializer ?

A:我为注册所做的方法只是一种用于注册依赖项的更清晰的抽象,您可以创建一些较小的特定类,而不是制作一个巨大的引导程序。

是的,使用我的方法意味着您不需要在引导程序中注册。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Nancy TinyIoC 配置 JsonNetSerializer 和 JsonNetBodyDeserializer 的相关文章

随机推荐

  • Win32 应用程序窗口最终停止在 Windows 7 上绘制

    我有一个用 C 没有 MFC 或 NET 编写的大型复杂应用程序 使用该软件最频繁的客户端将在启动该软件后大约一个小时内达到所有窗口都停止绘制的状态 我们收到报告称应用程序已 挂起 因为据他们所知没有发生任何事情 实际上 应用程序正在运行
  • 如何避免在 Excel VBA 中使用 Select

    我听说过很多关于使用的厌恶情绪 这是可以理解的 Select在 Excel VBA 中 但我不确定如何避免使用它 我发现如果我能够使用变量而不是变量 我的代码将更具可重用性Select功能 但是 我不确定如何指代事物 例如ActiveCel
  • ASP.NET MVC 是无状态的吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我听说 MVC NET 是
  • 为什么我们使用模板而不是函数?

    只是寻找一些好的理由 这样我就可以开始了解它们 避免重复除了不同类型之外其他方面相同的代码 有时 您根本不能依赖隐式转换或提升 也不能将所有内容都填充到对象层次结构中
  • 如何创建自动启动的C++程序

    我正在用 C 创建一个程序 我希望能够选择让用户让它在 Windows 中自动启动 因此 当用户启动计算机时 Windows 将自动启动该程序 我已经阅读过有关修改注册表或将其放入启动文件夹中的内容 但是最好的 干净 方法是什么 启动文件夹
  • 哈希表到底是什么?

    它们是什么以及它们如何工作 它们用在哪里 我什么时候应该 不 使用它们 我听过这个词很多次 但我不知道它的确切含义 我听到的是 它们允许关联数组 通过哈希函数发送数组键 该函数将其转换为 int 然后使用常规数组 我这样说对吗 注意 这不是
  • Laravel 5.2 的软删除级联

    我正在尝试在 Laravel 中实现软删除 这是我的人际关系 Tournament hasMany CategoryTournament hasOne CategorySettings Tournament hasMany Category
  • 隐藏活动指示器

    在我的主故事板上 我创建了一个活动指示器 我想隐藏我的活动指示器 直到按下按钮 我有办法做到这一点吗 当我按下按钮时 活动指示器开始动画 self indicator hidden NO self indicator startAnimat
  • 在 Postman 中使用集合变量

    所有的例子都在Learning getpostman com站点显示如何保存变量global or environment级别 以便从一个请求到另一个请求获取值 例如 pm environment set variableName Stri
  • 如何在 pandas 中创建多级数据框?

    给定两个不同的 df A a b 2016 11 21 2 1 2016 11 22 3 4 2016 11 23 5 2 2016 11 24 6 3 2016 11 25 6 3 B a b 2016 11 21 3 0 2016 11
  • R中的向后消除

    我试图使用 R 的向后消除来获得最终模型 但在运行代码时收到以下错误消息 有人可以帮我这个吗 base lt lm Eeff NDF data phuong fullmodel lt lm Eeff NDF ADF CP NEL DMI F
  • ReSharper 单元测试运行程序 - TestCase

    我喜欢使用 ReSharper 单元测试运行器 但它不支持 NUnit 2 5 中添加的 TestCase 属性 有什么办法可以解决这个问题吗 显然我可以使用另一个测试运行器 但我喜欢 ReSharper 我喜欢 ReSharper 但它还
  • 为 Eclipse RCP 中的状态栏/装饰做出贡献

    我需要在 Eclipse 应用程序的状态栏中显示状态指示器 我无法通过 ApplicationWindowAdviser 另一个团队拥有核心产品 做出贡献 但我确信我应该能够通过扩展点做出贡献 尽管进行了大量的谷歌搜索 我找不到任何描述如何
  • mapreduce.framework.name 在 mapred-site.xml 中的经典、本地之间有什么区别?

    官方对该参数的描述如下 The runtime framework for executing MapReduce jobs Can be one of local classic or yarn 我知道 yarn 值适用于 MRv2 它将
  • 如何通过 Objective-C 中的语音框架实现语音转文本?

    我想使用 iOS 语音框架在我的 Objective C 应用程序中进行语音识别 我找到了一些 Swift 示例 但在 Objective C 中找不到任何内容 是否可以从 Objective C 访问这个框架 如果是这样 怎么办 在花了足
  • 如果在“await”之后抛出,则任务抛出的异常将被吞掉

    我正在使用 NET 编写后台服务HostBuilder 我有一堂课叫MyService实现BackgroundService ExecuteAsync方法 我在那里遇到了一些奇怪的行为 在方法里面我await某个任务 以及之后抛出的任何异常
  • 使用 Json.NET 反序列化复杂对象

    我需要反序列化从 grogle 地图 api 返回的 json destination addresses Via Medaglie D Oro 10 47121 Forl FC Italia Via Torino 20123 Milano
  • 确定图像是否模糊

    我看到了很多关于这个的话题 我理解了这个理论 但我无法编写代码 我有一些照片 我想确定它们是否模糊 我找到了一个图书馆 aforge dll 我用它来对图像进行 FFT 举个例子 我正在处理两个图像 我的代码是 c public Bitma
  • 画布旋转文本工件

    I use Processing js在图像上显示一些 45 度旋转的文本 问题是 旋转后 文本变得难以阅读 因为伪影变得可见 字母间距不恒定或字母没有相同的底线 这里有一个demo 你可以看到第二个 Hello World 有 签名而不是
  • 使用 Nancy TinyIoC 配置 JsonNetSerializer 和 JsonNetBodyDeserializer

    我对南希来说是个菜鸟 我一直使用它作为生成 REST API 的框架 我熟悉 Json NET 所以我一直在玩Nancy Serialization JsonNet包裹 我的目标 自定义行为 即更改设置 JsonNetSerializer