10

我是依赖注入的新手,但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 的正确方向?

更新

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

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

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

现在我已经让 Logger 工作了!

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

4

4 回答 4

21

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

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

像您自己建议的那样使用构造函数初始化,仅在您具有单例类型依赖项时才有效(这就是您记录器工作的原因)。无论如何,如果您想将解决方案委托给 Web API DependencyResolver,您必须使用GetDependencyScope()(可以从 中调用HttpRequestMessage)作为一种解决方法。

不久前,我发布了一个关于使用 Ninject 执行此操作的演练。您应该使用这种方法来解决您的问题,因为您当前的解决方案已经耦合了 Ninject 和您的处理程序,这远非理想。

于 2013-02-07T22:32:59.117 回答
4

我正在使用这个:

 protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 {
    var service = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IFooService)) as IFooService;
    // Other stuff
 }
于 2016-10-18T08:46:03.947 回答
1

我想你需要的是这个

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

GlobalConfiguration.Configuration.ServiceResolver.SetResolver()

并传入 NInject 依赖解析器。

于 2013-02-07T17:25:15.203 回答
0

我有类似的情况,并从这篇文章和相关链接中得到提示,我想出了以下构造函数注入解决方案,这对我来说似乎工作正常:

using Ninject.Extensions.Logging;

公共静态无效注册(HttpConfiguration配置){

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 包

于 2015-07-19T14:36:03.000 回答