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

时间:2016-07-30 11:34:03

标签: c# log4net autofac

我在web api中使用autofac来注册log4net。它在控制器中运行良好,但我如何在同一解决方案中使用相同的log4net实例用于公共库项目类。

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

// 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);

我使用logger作为公共库项目中的属性。   public ILog logger { get; set; }

当我尝试记录消息时,它给出了以下异常。

  

对象引用未设置为对象的实例。

请告知我如何在公共图书馆项目中使用log4net。

2 个答案:

答案 0 :(得分:0)

因此有两种方法可以完成这项工作

1)在类库项目中注入ILog 2)解析类库项目中的Ilog对象

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

示例代码,

为类库项目示例创建合约

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";
    }
}

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

public class DomainModule : Module
{

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

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

或者如果您只是在应用程序启动时执行此操作,就可以直接注册。

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

答案 1 :(得分:0)

由于您在公共库项目中使用Logger作为属性,因此您只需使用[Dependency]属性装饰/注释该属性即可。这称为属性注入。我不确定你是否必须为autofac中的属性注入依赖项做额外的配置,但你可以尝试,如果不是你可以搜索它。