如何在 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 中的 属性 注入依赖项进行额外配置,但您可以尝试,如果没有,您可以搜索它。
我在我的网站中使用 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 中的 属性 注入依赖项进行额外配置,但您可以尝试,如果没有,您可以搜索它。