我有一個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.cs和MyTestModule.cs看到我註釋掉前面的靜態調用創建NLOG實例:
protected static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
他們現在只是與Autofac依賴注入屬性等取代這個:
public ILogger Logger { get; set; }
這個工作非常多,Logger對象被初始化爲記錄器的一個實例。
如何執行相當於LogManager.GetCurrentClassLogger()?
我需要用NLog模塊來做到這一點嗎?如果有我沒有找到任何具體的例子。任何幫助將非常感激!