[英]StructureMap injection per web request
我有一个带有多个控制器的ASP.NET Web Api 2 REST服务。 这些控制器的构造函数中的每一个都有一个ILogger参数,我必须将其与StructureMap一起插入。 是否可以为每个请求实例化一个ILogger,以获取客户端的特定信息(例如IP地址),然后将日志文件保存到特定路径?
这是我试图在DefaultRegistry中运行的代码,但是HttpContext始终为null。 我哪里错了?
For<ILogger>()
.Use(() => new TextFileLogger(
HttpContext.Current.Request.UserHostAddress +
DirectorySeparatorChar + "log.txt"));
我不是StructureMap的专家,但我了解这个问题。 您遇到的问题是您使用运行时数据来构建对象图。 注入运行时数据是一种反模式 。
这里的简单解决方案不是在组合根目录中直接使用HttpContext
,而是创建一个可用于确定FileLogger
路径的提供FileLogger
。 在这种情况下,作为该新提供程序的FileLogger
都可以成为单例,这更容易使用和理解。
提供程序可以很简单(c#6语法):
public class HttpLogfileProvider : ILogFileProvider
{
public string PathToLogfile =>
Path.Combine(HttpContext.Current.Request.UserHostAddress, "log.txt");
}
您的FileLogger
可以按以下方式使用此提供程序:
public class FileLogger : ILogger
{
private readonly ILogFileProvider logFileProvider;
public FileLogger(ILogFileProvider logFileProvider)
{
this.logFileProvider = logFileProvider;
}
public void Log(string message)
{
using (var writer = new StreamWriter(this.currentLogFile))
{
writer.WriteLine(message);
}
}
private string currentLogFile =>
this.logFileProvider.PathToLogFile;
}
我不是结构图用户,但我认为注册应该是:
For<ILogFileProvider>.Use<HttpLogfileProvider>.Singleton;
For<ILogger>.Use<FileLogger>.Singleton;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.