gpt4 book ai didi

c# - 将依赖项注入(inject) DelegatingHandler

转载 作者:太空狗 更新时间:2023-10-29 19:51:58 25 4
gpt4 key购买 nike

我是依赖注入(inject)的新手,但对 NinjectNinject.Extensions.Logging[Inject] 我的 ILogger 很满意 无论我需要什么。

但是一些DelegatingHandlers破坏了所有的乐趣。

public class HttpsHandler : DelegatingHandler
{
[Inject]
public ILogger Logger { get; set; }

protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!string.Equals(request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
Logger.Info(String.Format("{0}: is using HTTP", request.RemoteAddress());
return
Task.Factory.StartNew(
() =>
new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new StringContent("HTTPS Required")
});
}

return base.SendAsync(request, cancellationToken);
}
}

任何人都可以指出如何将 Ninject.Extensions.Logger.Nlog2 注入(inject)委托(delegate)处理程序内的 Ilogger 的正确方向吗?

更新

我认为 Pete 在评论中为我指明了正确的方向(谢谢!)。我将以下构造函数添加到 HttpsHandler:

public HttpsHandler()
{
var kernel = new StandardKernel();

var logfactory = kernel.Get<ILoggerFactory>();
this.Logger = logfactory.GetCurrentClassLogger();
}

现在我已经让 Logger 工作了!

我剩下的唯一问题是,这是正确的方法,还是反模式?

最佳答案

DelegatingHandlers 在 Web API 中仅在应用程序启动时初始化一次。

这是 Web API 的已知问题/设计功能(我推测是出于性能原因)- 请在此处查看错误报告 http://aspnetwebstack.codeplex.com/workitem/62 .

像您自己建议的那样使用构造函数初始化,只有在您具有单例类型依赖项时才有效(这就是您记录器工作的原因)。无论如何,如果您想将解析委托(delegate)给 Web API DependencyResolver,您必须使用 GetDependencyScope(),它可以从 HttpRequestMessage 中调用,作为解决方法。

posted a walkthrough on doing that with Ninject不久前。您应该使用这种方法来解决您的依赖关系,因为您当前的解决方案已经耦合了 Ninject 和您的处理程序,这远非预期。

关于c# - 将依赖项注入(inject) DelegatingHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com