将依赖项注入DelegatingHandler

我是dependency injection的新手,但对NinjectNinject.Extensions.Logging感到很满意,只要我需要它就可以[Inject]我的ILogger

然而,一些DelegatingHandler正在破坏所有的乐趣。

 public class HttpsHandler : DelegatingHandler { [Inject] public ILogger Logger { get; set; } protected override Task 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注入Ilogger的正确方向?

更新

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

 public HttpsHandler() { var kernel = new StandardKernel(); var logfactory = kernel.Get(); this.Logger = logfactory.GetCurrentClassLogger(); } 

现在我已经让Logger工作了!

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

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

这是Web API的已知问题/设计function(我假设出于性能原因) – 请参阅此处的错误报告http://aspnetwebstack.codeplex.com/workitem/62 。

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

我刚刚发布了一篇关于Ninject的演练 。 您应该使用这种方法来解决您的依赖性,因为使用您当前的解决方案,您已经将Ninject和您的处理程序耦合在一起,这是非常不需要的。

我用这个:

  protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var service = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IFooService)) as IFooService; // Other stuff } 

我想你需要的是这个 。

它是MVC的Ninject依赖解析器。 然后我相信你需要使用:

 GlobalConfiguration.Configuration.ServiceResolver.SetResolver() 

并传入NInject依赖项解析器。

我有类似的情况,并从这篇文章和相关链接中获取提示,我想出了以下构造函数注入解决方案,似乎对我有用:

 using Ninject.Extensions.Logging; 

public static void Register(HttpConfiguration config){

 ILoggerFactory loggerFactory = config.DependencyResolver.GetService(typeof(ILoggerFactory)) as ILoggerFactory; config.MessageHandlers.Add( new HttpsHandler(loggerFactory.GetLogger(typeof(HttpsHandler)))); // Other codes ... 

}

我使用Ninject for WebAi 2 / log4net并安装了所有相关的nuget包