我有以下界面:
public interface ILogger
{
void Debug(string message, params object[] values);
void Info(string message, params object[] values);
void Warn(string message, params object[] values);
void Error(string message, params object[] values);
void Fatal(string message, params object[] values);
}
以及以下实现:
public class Log4netLogger : ILogger
{
private ILog _log;
public Log4netLogger(Type type)
{
_log = LogManager.GetLogger(type);
}
public void Debug(string message, params object[] values)
{
_log.DebugFormat(message, values);
}
// other logging methods here...
}
我的想法是使用structuremap实例化Log4netLogger类,并使用执行日志记录的类的Type。但是,我一辈子都无法弄清楚如何将调用类的类型传递给structuremap,以便可以将其传递给日志记录实现的构造函数。任何有关如何做到这一点(或更好的方法)的建议将不胜感激。
最佳答案
如果类型参数是特定于上下文的,则我认为这不会如所示那样起作用。如果需要在构造函数中传递特定于上下文的内容,则可能必须创建一个工厂接口(interface)和实现,以返回ILogger的实例:
public interface ILoggerFactory
{
ILogger Create(Type type);
}
public class LoggerFactory : ILoggerFactory
{
public ILogger Create(Type type)
{
return new Log4netLogger(type);
}
}
可以引导BootStructureMap根据类型提供所需的实例,但是假定您事先知道的类型数量有限。
关于inversion-of-control - 在log4net包装器中使用structuremap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1942900/