Nancy: 如何向 NancyModule 注入依赖项,该依赖项本身取决于请求?

创建于 2018-02-25  ·  4评论  ·  资料来源: NancyFx/Nancy

先决条件

  • [x] 我写了一个描述性问题标题
  • [x] 我已经验证我正在运行最新版本的 Nancy
  • [x] 我已经验证了问题是否在DEBUGRELEASE模式下都存在
  • [x] 我已经搜索了打开关闭的问题,以确保它尚未被报告

描述

有时我需要从请求本身读取数据来初始化某个NancyModule所依赖的服务。 举个例子:

public interface IApiKeyProvider 
{
     string GetApiKey();
}

public class Service : IService
{
    private readonly IApiKeyProvider apiKeyProvider; 
    public Service(IApiKeyProvider apiKeyProvider) 
    {
           this.apiKeyProvider = apiKeyProvider;
    }

    // ... implementation
}

我会这样注册:

container.Register<IService, Service>();
container.Register<IApiKeyProvider, FromRequestApiKeyProvider>(); 

其中FromRequestApiKeyProvider类通过从请求中读取数据来提供 api 密钥。 这是我需要能够做到的:

// Hypothetical class
public class FromRequestApiKeyProvider : IApiKeyProvider
{
    private readonly NancyRequest request;
    public FromRequestApiKeyProvider(NancyRequest request)
    {
         this.request = request;
    }

    public string GetApiKey() 
    {
         return this.request.Query["apiKey"];
    }
}

无法做到这一点迫使我在请求处理程序中初始化Service的具体实现,这反过来又禁止我对我的 NancyModule 进行单元测试。

弹出的另一种情况是我将数据放入Items Before管道中NancyContext的 Items 中(在 Bootstrapper -> ApplicationStartup 中),然后需要读取数据我放入 NancyContext 来初始化一些类似上面的服务。

作为后一种情况的示例,请参阅Nancy.Serilog库,您必须从请求处理程序内部获取上下文记录器,即var logger = this.CreateLogger();理想情况下,这将作为构造函数级别的 NancyModule 的依赖项注入.

最有用的评论

我不知道标准,但我认为可以通过在请求容器中注册上下文或请求来实现。 只需在引导程序中覆盖ConfigureRequestContainer即可。

所有4条评论

你不能只在请求容器中注册上下文或请求吗?

等等,有一个标准的方法可以做到这一点😅,请问我在哪里可以找到示例?

我不知道标准,但我认为可以通过在请求容器中注册上下文或请求来实现。 只需在引导程序中覆盖ConfigureRequestContainer即可。

哇,这确实有效,非常感谢 :heart: :pray: 我使用了这段代码:

protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
{
    Func<ILogger> getLogger = () =>
    {
        if(!context.Items.ContainsKey("RequestId"))
        {
            return Log.Logger;
        }

        var requestId = (string)context.Items["RequestId"];
        var contextualLogger = Log.ForContext("RequestId", requestId);
        return contextualLogger;
    };

    container.Register((tinyIoc, namedParams) => getLogger());
}
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

phillip-haydon picture phillip-haydon  ·  10评论

thecodejunkie picture thecodejunkie  ·  8评论

cody82 picture cody82  ·  9评论

mylemans picture mylemans  ·  9评论

jgillich picture jgillich  ·  7评论