使用 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 的相关文章

  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template

随机推荐

  • 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