为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Autofac 从 Factory 解析接口

使用 Autofac 从 Factory 解析接口

C#
Smart猫小萌 2023-04-29 10:13:29
我是 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 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

这是我最终得到的模块:

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


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信