Как настроить контейнер для создания единичных / реальных экземпляров регистратора - PullRequest
4 голосов
/ 01 февраля 2011

Я сейчас растерялся и, возможно, не понимаю настоящей проблемы.

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

например

public class CommonFileSaver : IFileSaver
    {
           private static ILog _log = LogManager.GetLogger();

           .....
    }

Я хочу протестировать процесс регистрации. И мое текущее решение - использовать макет интерфейса ILog.

На данный момент я решил использовать Unity для разрешения зависимостей.

Итак, линия

ILog _log = LogManager.GetLogger(); 

будет выглядеть как

ILog _log = Resolver.Instance.Resolve<ILoger>();

Вопрос в том, как настроить контейнер Unity для возврата мне нового экземпляра объекта ILog с использованием фабрики LogManager.

Спасибо.

P.S. ILog - это интерфейс log4net, и весь процесс ведения журнала прямо сейчас реализован с использованием log4net.

Ответы [ 4 ]

2 голосов
/ 01 февраля 2011

Возможно, это не правильно в дизайне, но использование фабрики возможно в Unity ...

_container = new UnityContainer();
_container.RegisterType<ILog>(new InjectionFactory(c => LogManager.GetLogger()));
1 голос
/ 01 февраля 2011

Если цель того, чего вы пытаетесь достичь, это протестировать процесс регистрации с помощью ложного ILog, когда я бы посоветовал вам также смоделировать LogManager и настроить ожидание на GetLogger, чтобы оно вернулосьМакет ILog.

1 голос
/ 01 февраля 2011

Проблема в том, что вы не следуете голливудскому принципу. Статические фабричные методы и синглтоны плохо подходят для внедрения зависимостей. Вы должны изменить свой код, чтобы добавить фабрику ILog:

public class CommonFileSaver : IFileSaver
{
   public CommonFileSaver(ILogFactory logFactory)
   {
      _log = logFactory.GetLogger();
   } 

   private readonly ILog _log;

   .....
}
1 голос
/ 01 февраля 2011

Вы можете написать обертку для log4net (что в любом случае является хорошей идеей).Оболочка позаботится о создании экземпляров с помощью метода фабрики log4net, а также обеспечит вызов метода «Configure».

Если вы напишите обертку, возможно, вы захотите рассмотреть это информация .

...