将依赖项注入DelegatingHandler
我是dependency injection的新手,但对Ninject
和Ninject.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包