C#学习教程:如何将依赖名称作为构造函数参数注入PropertiesAutowired().InstancePerDependency();但是,我的Log4NetAdapter类有一个需要调用类名称的构造函数参数。这样我就可以根据调用类的名称记录事件。公共类Log4NetAdapter:ILogger{privatereadonlyILog_logger;publicLog4NetAdapter(stringlogName){_logger=LogManager.GetLogger(logName);}...}如果每个依赖项都有自己的Log4NetAdapter实例,我如何将typeof(dependency).Name(即typeof(dependency).Name)注入到属性注入类的构造函数中?更新:基于LogInjectionModule示例和Autofac如何进行属性注入,我扩展了模块以执行构造函数和属性注入。注意:我已经修复了在LogManager中传递给LogManager的类型以使用声明的类型。这使得例如解决>使用正确的日志类型。使用System.Linq;使用log4net;公共类LogInjectionModule:模块{registration.Activating+=OnComponentActivating;}privatestaticvoidOnComponentActivating(objectsender,ActivatingEventArgse){InjectLogProperties(e.Context,e.Instance,false);}privatestaticvoidOnComponentPreparing(objectsender,PreparingEventArgse){e.Parameters=e.Parameters.Union(new[]{newResolvedParameter((p,i)=>p.ParameterType==typeof(ILog),(p,i)=>LogManager.GetLogger(p.Member.DeclaringType))});}privatestaticvoidInjectLogProperties(IComponentContextcontext,objectinstance,booloverrideSetValues){if(context==null)thrownewArgumentNullException("context");如果(实例==null)抛出新的ArgumentNullException(“实例”);varinstanceType=instance.Get类型();varproperties=instanceType.GetProperties(BindingFlags.Public|BindingFlags.Instance).Where(pi=>pi.CanWrite&&pi.PropertyType==typeof(ILog));foreach(varpropertyinproperties){if(property.GetIndexParameters().Length!=0)继续;varaccessors=property.GetAccessors(false);如果(accessors.Length==1&&accessors[0].ReturnType!=typeof(void))继续;if(!overrideSetValues&&accessors.Length==2&&(property.GetValue(instance,null)!=null))继续;ILogpropertyValue=LogManager.GetLogger(实例类型);property.SetValue(instance,propertyValue,null);}}}关于如何使用模块,这里有一个例子:publicclassService{publicService(ILoglog){...}}varcb=newContainerBuilder();cb.RegisterModule();cb.RegisterType();varc=cb.Build();varservice=c.Resolve();您只使用logName来有效地解析名称ILog,那么为什么不直接注入ILog?公共类Log4NetAdapter:ILogger{privatereadonlyILog_logger;公共Log4NetAdapter(ILog记录器){_logger=记录器;}...}好的,现在我刚刚解决了这个问题,但我也减少了它与其他类的耦合(即LogManager所以如果我使用unity,我会确保我得到正确的记录器:varchildContainer=container.CreateChildContainer();childContainer.RegisterInstance(LogManager.GetLogger(logName));varadapter=childContainer.Resolve();子容器阻止任何其他代码访问ILog。你可以随心所欲,我不会知道你的代码了。以上就是C#学习教程:如何将依赖名称作为构造函数参数注入,分享全部内容,如果对大家有用还需要了解更多关于C#学习教程,希望大家多多指教多多关注,本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
