如何将依赖项名称作为构造函数参数注入
使用Autofac,我可以使用以下代码注册一个类来解析使用属性注入的接口:
builder.RegisterType() .As() .PropertiesAutowired() .InstancePerDependency();
但是,我的Log4NetAdapter
类有一个构造函数参数,需要调用类的名称。 这样,我可以根据调用类的名称记录事件。
public class Log4NetAdapter : ILogger { private readonly ILog _logger; public Log4NetAdapter(string logName) { _logger = LogManager.GetLogger(logName); } ... }
如果每个依赖项都有自己的Log4NetAdapter
实例,我怎样才能将typeof(dependency).Name
的名称(即typeof(dependency).Name
)注入到属性注入类的构造函数中?
更新:基于LogInjectionModule示例以及Autofac如何进行属性注入 ,我已经扩展了模块以执行构造函数和属性注入。
注意:我已修复传递给LogManager
中LogManager
的类型以使用声明类型。 这使得例如Resolve
使用正确的日志类型。
using System.Linq; using log4net; public class LogInjectionModule : Module { protected override void AttachToComponentRegistration(IComponentRegistry registry, IComponentRegistration registration) { registration.Preparing += OnComponentPreparing; registration.Activating += OnComponentActivating; } private static void OnComponentActivating(object sender, ActivatingEventArgs
关于如何使用该模块,这是一个示例:
public class Service { public Service(ILog log) { ... } } var cb = new ContainerBuilder(); cb.RegisterModule(); cb.RegisterType(); var c = cb.Build(); var service = c.Resolve ();
你只使用logName
来有效地解析名称ILog
,那么为什么不注入一个ILog
呢?
public class Log4NetAdapter : ILogger { private readonly ILog _logger; public Log4NetAdapter(ILog logger) { _logger = logger; } ... }
好的,所以现在我刚刚解决了这个问题,但是我也把它与其他类(即LogManager
耦合程度降低了。
因此,如果我使用统一,我会这样做,以确保我得到正确的记录器:
var childContainer = container.CreateChildContainer(); childContainer.RegisterInstance(LogManager.GetLogger(logName)); var adaptor = childContainer.Resolve();
子容器阻止任何其他代码访问该ILog
。 你可以随心所欲地做到这一点,我对你的代码不再了解。
上述就是C#学习教程:如何将依赖项名称作为构造函数参数注入分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1026884.html