我已经被指示在log4net旁边使用AutoFac(而不是Castle Windsor),并且在如何正确使用这些技术方面迷失了。
使用autofac网站上的示例我有以下LoggerModule
public class LoggingModule : Module
{
private static void InjectLoggerProperties(object instance)
{
var instanceType = instance.GetType();
// Get all the injectable properties to set.
// If you wanted to ensure the properties were only UNSET properties,
// here's where you'd do it.
var properties = instanceType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.PropertyType == typeof(ILog) && p.CanWrite && p.GetIndexParameters().Length == 0);
// Set the properties located.
foreach (var propToSet in properties)
{
propToSet.SetValue(instance, LogManager.GetLogger(instanceType), null);
}
}
private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter((p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(t))
});
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
// Handle constructor parameters.
registration.Preparing += OnComponentPreparing;
// Handle properties.
registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
}
}
以下注册它的代码
builder.RegisterModule(new LoggingModule());
这是整合它的正确方法吗?
我如何在MVC控制器中使用它?
答案 0 :(得分:7)
log4net模块就像任何其他Autofac module一样 - 您在ContainerBuilder
中注册(如您所示)以及所有其他注册。
// EITHER
builder.RegisterModule<LoggingModule>();
// OR
builder.RegisterModule(new LoggingModule());
The documentation on the log4net module page解释了如何将ILog
参数注入到对象的构造函数或属性中。
所以,就像任何其他IoC结构化类一样,要使用它,你需要添加一个构造函数或属性来允许它被注入。
public class SomeClassThatNeedsLogging
{
private ILog _logger;
public SomeClassThatNeedsLogging(ILog logger)
{
this._logger = logger;
}
}
而且,您可以再次使用构造函数或属性注入。
public class SomeClassThatNeedsLogging
{
public ILog Logger { get; set; }
}
当您解决注册用户时,Autofac会进行连线。
var someClass = container.Resolve<SomeClassThatNeedsLogging>();
// someClass will have the ILog value populated.
对于控制器,您已经注册了Autofac,所以您需要做的就是添加构造函数参数或公共可写属性。 MVC集成完成所有分辨率,因此没有手动操作,没有Resolve
调用或任何事情。
如果仍然不清楚,我建议您花一些时间与the Autofac quick start guide一起潜入the rest of the documentation。