2015-02-10 42 views
2

我有一個ASP.NET Webforms項目,我最近通過Autofac轉換爲使用依賴注入。它一切進展順利,直到我試圖注入我的NLog實例。我無法解決如何執行靜態GetCurrentClassLogger()方法調用與注入Logger對象的屬性的等效操作。如何在ASP.NET Webforms中使用Autofac注入NLog

這是我的示例代碼示出了該問題:

的Global.asax.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using Autofac; 
using Autofac.Integration.Web; 

public class Global : HttpApplication, IContainerProviderAccessor 
{ 
    private static IContainerProvider containerProvider; 

    public IContainerProvider ContainerProvider 
    { 
    get { return containerProvider; } 
    } 

    void Application_Start(object sender, EventArgs e) 
    { 
    var builder = new ContainerBuilder(); 
    Bootstrapper.RegisterInstances(builder); 
    containerProvider = new ContainerProvider(builder.Build()); 
    } 
} 

Bootstrapper.cs

using Autofac; 

public static class Bootstrapper 
{ 
    public static void RegisterInstances(ContainerBuilder builder) 
    { 
    builder.RegisterType<Logger>().As<ILogger>().InstancePerRequest(); 
    builder.RegisterType<MyTestModule>().As<IMyTestModule>().InstancePerRequest(); 
    } 
} 

MyTestModule.cs

using System; 

public class MyTestModule : IMyTestModule 
{ 
    // was previously: protected static readonly ILogger Logger = LogManager.GetCurrentClassLogger(); 

    private ILogger _logger; 

    public MyTestModule(ILogger logger) 
    { 
    _logger = logger; 
    } 

    public void DoSomethingBad() 
    { 
    try 
    { 
     int z = 5/0; 
    } 
    catch (Exception ex) 
    { 
     _logger.Error("Error!", ex); 
    } 
    } 
} 

public interface IMyTestModule 
{ 
    void DoSomethingBad(); 
} 

PageBase.cs

public abstract class PageBase : Page 
{ 
    // was previously: protected static readonly ILogger Logger = LogManager.GetCurrentClassLogger(); 

    public ILogger Logger { get; set; } 

    public IMyTestModule MyTestModuleInstance { get; set; } 
} 

Default.aspx的

<%@ Page Title="Home" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<html> 
    <head></head> 
    <body></body> 
</html> 

Default.aspx.cs

using System; 

public partial class _Default : PageBase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    MyTestModuleInstance.DoSomethingBad(); 
    } 
} 

可以在PageBase.csMyTestModule.cs看到我註釋掉前面的靜態調用創建NLOG實例:

protected static readonly ILogger Logger = LogManager.GetCurrentClassLogger(); 

他們現在只是與Autofac依賴注入屬性等取代這個:

public ILogger Logger { get; set; } 

這個工作非常多,Logger對象被初始化爲記錄器的一個實例。

如何執行相當於LogManager.GetCurrentClassLogger()

我需要用NLog模塊來做到這一點嗎?如果有我沒有找到任何具體的例子。任何幫助將非常感激!

回答

2

重寫你的模塊的AttachTocomponentRegistaration

public class AutofacLogInjectionModule : Module 
{ 
    protected override void AttachToComponentRegistration(IComponentRegistry registry, IComponentRegistration registration) 
    { 
     registration.Preparing += OnComponentPreparing; 
    } 

    static void OnComponentPreparing(object sender, PreparingEventArgs e) 
    { 
     e.Parameters = e.Parameters.Union(new[] 
    { 
     new ResolvedParameter((p, i) => p.ParameterType == typeof(ILogger), (p, i) => LogManager.GetCurrentClassLogger()) 
    }); 
    } 

} 

而在你的引導註冊此模塊:

builder.RegisterModule(new AutofacLogInjectionModule());