0

我想为我的 Nancy 模块使用自定义序列化,它使用请求的 URL 作为其输入的一部分。

我已经看到您需要在 ConfigureRequestContainer 的覆盖中注册使用上下文的依赖项(如C# IOC 和 NancyFX 中的请求状态中所回答)

public class NancyBootstrapper : DefaultNancyBootstrapper
{
    protected override void ConfigureRequestContainer(
        TinyIoCContainer container, 
        NancyContext context)
    {
        container.Register<JsonSerializer>(new CustomJsonSerializer(context));
    }
}

而且我已经看到您可以使用 IRegistrations 接口为 Nancy 指定不同的序列化器(如使用 Nancy TinyIoC 配置 JsonNetSerializer 和 JsonNetBodyDeserializer 中所回答的)

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; }
}

如果我以第一种方式注册我的序列化程序,我无法让 Nancy 将它用于 JSON 序列化。

如果我以第二种方式注册它,我将无法注入当前 NancyContext 的副本并获取对请求的访问权限——它甚至会在调用该方法之前尝试创建序列化程序的实例。ConfigureRequestContainer

我在这里想念什么?

4

1 回答 1

1

假设您对“序列化”部分感兴趣 - 即将您的模型作为 json 返回,您是否考虑过扩展您的模型以通过管道传输所需的信息,然后通过序列化程序将其剥离?

以下代码假设自定义序列化程序足够智能,不会序列化 null 属性。

Get["/somedata"] = _ => new MyModelEx
   { 
      WhateverRealProperty = "some data",
      RequestUri = this.Context.Request.Uri
   };

public class MyModelEx : MyModel, IModelWithRequestUri
{
    public string RequestUri {get; set;}
}

在您的序列化程序中,您可以测试这个“额外”数据元素,从中获取您需要的任何内容,将其剥离(将其设置为空??)并序列化其余部分。

或者上面的变体,你可以有一些“容器”通用模型,比如

public class ExtendedModel<T>
{
    public T Model {get; set;}
    public string RequestUri {get;set;} // or even pass the whole context if u need to
}

以上的一些变体将是最简单的实现。

我更喜欢一种不同的方法,在这种方法中,我将创建某种形式的按请求“包”,在其中保存当前上下文,并将该包注入序列化程序(当然,这将要求序列化程序根据每个请求进行注册) -请求也是如此)。

检查这个答案的想法

于 2015-07-07T00:01:43.007 回答