我想知道这是否是一件非常简单的事情,我只是错过了,或者还有更多内容。
基本上,我要做的是使用StructureMap的setter注入来实现记录器。我希望StructureMap使用的记录器的构造函数接受Type
参数来创建记录器:
public class Logger : ILogger
{
private ILog _log = null;
public Logger() { _log = LogManager.GetCurrentClassLogger(); }
public Logger(string name) { _log = LogManager.GetLogger(name); }
public Logger(Type loggerType) { _log = LogManager.GetLogger(loggerType); }
// The rest of the implementation...
}
在我的引导代码中,我将其初始化为:
ObjectFactory.Configure(x => {
x.FillAllPropertiesOfType<ILogger>().Use(l =>
new Logger(l.BuildStack.Current.ConcreteType));
// Further unrelated bootstrapping...
});
它不是100%完全正常工作,而我可能只是缺乏充分理解。所以我对我所看到的行为有几个问题:
ILogger
。我怎样才能使它成为包含被注入的setter的类型?也许有一种完全不同/更简单/更好的方式来完成我想要做的事情,我欢迎这方面的建议。基本上,我在IoC容器后面抽象我的日志记录实现,我需要特定于类的记录器。
答案 0 :(得分:1)
也许这不是您正在寻找的确切答案,但为什么不通过创建ILoggerFactory
来简化所有内容?您可以注册ILogger
并在您的课程中注入ILoggerFactory
,而不是注册ILoggerFactory
:
public interface ILoggerFactory
{
ILogger CreateFor(string name);
ILogger CreateFor<T>();
ILogger CreateFor(Type loggerType);
}
public class LoggerFactory : ILoggerFactory
{
public ILogger CreateFor(string name)
{
return LogManager.GetLogger(name);
}
public ILogger CreateFor<T>()
{
return CreateFor(typeof(T));
}
public ILogger CreateFor(Type loggerType)
{
return LogManager.GetLogger(loggerType);
}
}