我是依赖注入的新手,但对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注入委托操作员内的Ilogger?
更新
我认为Pete在评论中让我的方向正确(谢谢!)。
我将以下构造函数添加到HttpsHandler
:
public HttpsHandler()
{
var kernel = new StandardKernel();
var logfactory = kernel.Get<ILoggerFactory>();
this.Logger = logfactory.GetCurrentClassLogger();
}
现在我已经让Logger工作了!
我唯一的问题是,这是正确的方式吗,还是反模式?
答案 0 :(得分:17)
DelegatingHandlers
仅在应用程序启动时在Web API中初始化一次。
这是Web API的已知问题/设计功能(我假设出于性能原因) - 请参阅此处的错误报告http://aspnetwebstack.codeplex.com/workitem/62。
使用像你自己建议的构造函数初始化,只有你有单例类型的依赖项(这就是你记录器的工作原理)才有效。无论如何,如果您要将解析权委托给Web API DependencyResolver
,您必须使用GetDependencyScope()
作为解决方法,可以将其从HttpRequestMessage
调用。
答案 1 :(得分:4)
我正在使用它:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var service = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IFooService)) as IFooService;
// Other stuff
}
答案 2 :(得分:1)
我认为你需要的是this。
这是MVC的Ninject依赖解析器。然后我相信你需要使用:
GlobalConfiguration.Configuration.ServiceResolver.SetResolver()
并传入NInject依赖项解析器。
答案 3 :(得分:0)
我有类似的情况,并从这篇文章和相关链接中得到提示,我想出了以下构造函数注入解决方案,似乎对我有用:
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包