我在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。
答案 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中的属性注入依赖项做额外的配置,但你可以尝试,如果不是你可以搜索它。