我是Autofac的新手,正在尝试使用工厂来解析接口,但似乎无法在文档中找到相关的部分来使它正常工作。
我具有以下接口来抽象日志记录实现:
public interface ILog
{
void Info(string message);
void Debug(string message);
void Error(string message, Exception exception = null);
}
public interface ILogFactory
{
ILog GetLogger(Type type);
}
然后是这些接口的以下实现:
public class Log : ILog
{
private readonly Action<string> _logDebug;
private readonly Action<string, Exception> _logError;
private readonly Action<string> _logInfo;
public Log(Action<string> logInfo, Action<string> logDebug, Action<string, Exception> logError)
{
_logDebug = logDebug;
_logInfo = logInfo;
_logError = logError;
}
public void Debug(string message)
{
_logInfo(message);
}
public void Error(string message, Exception exception = null)
{
_logError(message, exception);
}
public void Info(string message)
{
_logInfo(message);
}
}
public class Log4NetLogFactory : ILogFactory
{
public Log4NetLogFactory()
{
XmlConfigurator.Configure();
}
public ILog GetLogger(Type type)
{
var logger = LogManager.GetLogger(type);
return new Log(logger.Info, logger.Debug, logger.Error);
}
}
我对如何使用ILogFactory解决Autofac中的ILog感到困惑。我已经为ILogFactory注册了一个单例:
builder.RegisterType<Log4NetLogFactory>().As<ILogFactory>().SingleInstance();
但是我不确定如何使用ILogFactory的GetLogger方法传递调用者类型来解析ILog接口。
看来我需要这样的东西:
builder.Register((c, p) => c.Resolve<ILogFactory>().GetLogger(??Caller Type Here??)).As<ILog>();
但是我不确定如何将调用者类型放入GetLogger构造函数中。
答案 0 :(得分:0)
感谢this的回答,我设法使这项工作得以实现。这是我最后得到的模块:
public class LoggingModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<Log4NetLogFactory>().As<ILogFactory>().SingleInstance();
builder.Register((c, p) => c.Resolve<ILogFactory>().GetLogger(p.TypedAs<Type>()));
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing +=
(sender, args) =>
{
var forType = args.Component.Activator.LimitType;
var logParameter = new ResolvedParameter(
(p, c) => p.ParameterType == typeof(ILog),
(p, c) => c.Resolve<ILog>(TypedParameter.From(forType)));
args.Parameters = args.Parameters.Union(new[] { logParameter });
};
}
}
可以通过以下方式在容器中注册:
builder.RegisterModule(new LoggingModule());