DEBUG
和RELEASE
模式下都存在有时我需要从请求本身读取数据来初始化某个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
即可。
哇,这确实有效,非常感谢 :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());
}
最有用的评论
我不知道标准,但我认为可以通过在请求容器中注册上下文或请求来实现。 只需在引导程序中覆盖
ConfigureRequestContainer
即可。