AutoFac和Log4Net - 注册和使用

时间:2014-07-17 19:31:00

标签: model-view-controller log4net autofac

我已经被指示在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控制器中使用它?

1 个答案:

答案 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