我是依赖注入(inject)的新手,但对 Ninject
和 Ninject.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/