将依赖项注入DelegatingHandler

时间:2013-02-07 16:52:51

标签: c# dependency-injection asp.net-web-api ninject ninject.web.mvc

我是依赖注入的新手,但对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注入委托操作员内的Ilogger?

更新

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

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

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

现在我已经让Logger工作了!

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

4 个答案:

答案 0 :(得分:17)

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

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

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

我前一段时间posted a walkthrough on doing that with Ninject。您应该使用这种方法来解决您的问题,因为使用您当前的解决方案,您可以使用Ninject&amp;你的处理程序,这是不可取的。

答案 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包