2014-07-17 116 views
2

我被指示沿着log4net使用AutoFac(而不是Castle Windsor),並且在如何正確使用這些技術時丟失了指令。AutoFac和Log4Net - 註冊和使用

使用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控制器中使用它?

回答

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