如何在 CommonLibrary 项目中使用 Log4Net 和 Autofac

how to use Log4Net with Autofac in CommonLibrary project

我在我的网站中使用 autofac api 来注册 log4net。它在控制器中工作正常,但我如何在同一解决方案中为公共库项目 类 使用相同的 log4net 实例。

我使用下面的代码在网络中使用 autofac 注册 log4net api。

// IOC Container Setup uisng Autofac
var builder = new ContainerBuilder();

// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.Register(c => LogManager.GetLogger(typeof(Object))).As<ILog>();
builder.RegisterWebApiFilterProvider(config);
builder.RegisterModule<AMLWebApiModule>();
builder.RegisterFilterProvider();
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

我在公共图书馆项目中将记录器用作 属性。 public ILog logger { get; set; }

当我尝试记录消息时出现以下异常。

Object reference not set to an instance of an object.

请告知如何在公共库项目中使用 log4net。

所以有两种方法可以使这项工作

1) 在class库项目中注入ILog 2)解析class库项目

中的Ilog对象

我会选择选项 1) 并将在 autofac 中注册我的所有组件以充分利用 DI 并保持每个组件独立。

示例代码,

为 class 库项目示例创建合同

public interface Ilibrary
{
    string GetName();
}

public class Library : Ilibrary
{
    private ILog _log;
    public Library(ILog log)
    {
        _log = log;
    }
    public string GetName()
    {
        _log.Debug("log message");
        return "test";
    }
}

然后在 class 库项目中创建一个模块并在您的应用程序启动中注册该模块。

public class DomainModule : Module
{

    protected override void Load(ContainerBuilder builder)
      {
        base.Load(builder);

        builder.RegisterType<Library>()
        .AsImplementedInterfaces()
        .SingleInstance();
      }
}

或者,如果您只需在应用程序启动时执行此操作即可访问 Concert 实施,您也可以直接注册。

builder.RegisterType<Library>()
.AsImplementedInterfaces()
.SingleInstance();

由于您在公共库项目中将 Logger 用作 属性,因此您可以 decorate/annotate 属性 具有 [Dependency] 属性。这称为 属性 注入。我不确定您是否必须对 autofac 中的 属性 注入依赖项进行额外配置,但您可以尝试,如果没有,您可以搜索它。