Как использовать Log4Net с Autofac в проекте CommonLibrary
Я использую autofac в моем веб-API для регистрации log4net. Он работает нормально в контроллере, но как я могу использовать тот же экземпляр log4net для общих классов проекта библиотеки в том же решении.
Я использовал приведенный ниже код для регистрации log4net с помощью autofac в веб-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; }
когда я пытался записать сообщение, это дает исключение ниже.
В экземпляре объекта не задана ссылка на объект.
Посоветуйте, пожалуйста, как мне использовать log4net в проекте общей библиотеки.
2 ответа
Таким образом, есть два подхода, чтобы сделать эту работу
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();
Поскольку вы используете Logger в качестве свойства в проекте общей библиотеки, вы можете просто декорировать / аннотировать это свойство с помощью атрибута [Dependency]. Это называется инъекцией свойств. Я не уверен, нужно ли вам делать дополнительную настройку для зависимостей, введенных свойством, в autofac, но вы можете попробовать, если нет, вы можете найти его.