将依赖项注入DelegatingHandler

Jos*_*nke 7 c# dependency-injection ninject ninject.web.mvc asp.net-web-api

我是新来的依赖注入,但高兴NinjectNinject.Extensions.Logging[Inject]我的ILogger地方,我需要它.

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

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);
        }
 }
Run Code Online (Sandbox Code Playgroud)

有人能指出我如何在委托操作员内部将Ninject.Extensions.Logger.Nlog2注入Ilogger吗?

更新

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

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

            var logfactory = kernel.Get<ILoggerFactory>();
            this.Logger = logfactory.GetCurrentClassLogger();
        }
Run Code Online (Sandbox Code Playgroud)

现在我已经让Logger工作了!

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

Fil*_*p W 19

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

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

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

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