Jos*_*nke 7 c# dependency-injection ninject ninject.web.mvc asp.net-web-api
我是新来的依赖注入,但高兴Ninject
和Ninject.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和您的处理程序耦合在一起,这是非常不需要的.
归档时间: |
|
查看次数: |
7450 次 |
最近记录: |