c# - 将依赖项注入(inject) DelegatingHandler

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

我是依赖注入(inject)的新手,但对 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 注入(inject)委托(delegate)处理程序内的 Ilogger 的正确方向吗?

更新

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

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

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

现在我已经让 Logger 工作了!

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

最佳答案

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

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

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

posted a walkthrough on doing that with Ninject不久前。您应该使用这种方法来解决您的依赖关系,因为您当前的解决方案已经耦合了 Ninject 和您的处理程序,这远非预期。

关于c# - 将依赖项注入(inject) DelegatingHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756519/

相关文章:

c# - 如何对继承类使用依赖注入(inject)?

c# - 读取和编辑 HttpResponseMessage 的内容

c# - 文件保存选取器 - 保存编辑后的图像(C# Metro 应用程序)

php - 数据映射器模式中 Symfony 依赖注入(inject)组件的循环依赖

c# - asp.net网站如何获取cookie值

vba - VBA 的 IoC 容器

java - 为什么一个类需要访问 Spring 上下文?

.Net - 使用 HttpClient 发布文件?

c# - 在 C# 中序列化/编码简单对象以通过网络发送,供非托管 C++ 应用程序读取

c# - 只有静态方法的类应该是静态的吗?