私はStructureMapの専門家ではありませんが、私はこの問題を理解しています。問題は、実行時データを使用してオブジェクトグラフを構築することです。そしてinjecting runtime data is an anti-pattern。
ここでの簡単な解決策は、コンポジションルートに直接HttpContext
を使用するのではなく、FileLogger
のパスを決定するために使用できるプロバイダを作成することです。この場合、この新しいプロバイダーとしてのFileLogger
はシングルトンになる可能性があります。
プロバイダーは(#6構文c)のような単純なものでした:
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;
}
を私はのStructureMapユーザーではないんだけど登録は次のようにする必要があります:
For<ILogFileProvider>.Use<HttpLogfileProvider>.Singleton;
For<ILogger>.Use<FileLogger>.Singleton;
本当にありがとうございます。私は依存症注入の新人です。これらの情報は私にとって純粋な金です! –