亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 142 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號