Как использовать 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, но вы можете попробовать, если нет, вы можете найти его.

Другие вопросы по тегам