使用Autofac

时间:2019-06-21 13:11:44

标签: c# autofac

我是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构造函数中。

1 个答案:

答案 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());