Как использовать единство log4net расширения в разных слоях - PullRequest
0 голосов
/ 16 ноября 2018

Я использую Unity.WwebAPI в своем проекте веб-API.Он устанавливается на уровне обслуживания, где у меня есть классы контроллера.Все работает нормально.

Теперь я пытаюсь создать класс-оболочку в отдельном проекте ведения журнала, чтобы я мог использовать единство log4net-расширения для разных уровней в моем решении.

Как я могу зарегистрировать Unityрасширение log4net в моем проекте регистрации?Я знаю, как сделать это в файле UnityConfig на служебном уровне, но я хочу, чтобы это было в проекте ведения журнала, чтобы мой метод сообщения журнала мог быть доступен на разных уровнях

container.AddNewExtension ();

Вот мой класс тестовой оболочки;

Класс оболочки Unity Log4Net

 public class LogWrapper : ILogWrapper
{
    private readonly ILogWrapper _logWrapper;
    private ILog _log;

    public LogWrapper(ILogWrapper logWrapper)
    {
        _logWrapper = logWrapper;
    }

    public void LogMessage(string msg)
    {
        _log.Info(msg);
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Наличие собственного регистратора

Проект лесозаготовок

public interface ILogger {
     void LogMessage(string msg);
}

чтобы не связывать ваш код со сторонним регистратором - хорошая идея.

Корневой проект

public class Log4NetWrapper : ILogger {
    private readonly ILog log; //log4net 

    public Log4NetWrapper(ILog log) {
        this.log = log;
    }

    public void LogMessage(string msg) {
        log.Info(msg);
    }

    //...
}

Осталось только зарегистрировать свой собственный регистратор вместе с сторонним расширением контейнера в корне композиции.

Проект Root (Композиция Root)

container = new UnityContainer();

//...

container.AddNewExtension<Log4NetExtension>();

//...

container.RegisterType<ILogger, Log4NetWrapper>(new HierarchicalLifetimeManager());

И используйте ваш внутренний регистратор, где это необходимо, в разных слоях.

public MyService(ILogger log) {
    //...
}

при использовании этой абстракции другим слоям не нужно знать, что используется за сценой для ведения журнала.

Только корень композиции должен знать о сторонней зависимости, чтобы зарегистрировать ее в контейнере IoC.

...