снова о log4net и Единице конфигурация МОК

Я натолкнулся через несколько из этих вопросов, наложение вокруг различных сайтов и ответов, кажется, вращает l4n officianados к значению легкой обертки, которая log4net (разве, Вы не получаете его?) и подобные вопросы ошеломляющего факта.

Однако кажется, что то, что просят пользователи (и это - мой вопрос), - то, как вместить модель log4net objet в последовательность registertype/registerinstance в быстром интерфейсе конфигурации.

Цель здесь не состояла бы в том, чтобы повторно перенести l4n, но просто захватить достойную ссылку, которая' не требует угона быстрого потока, как это было.

плохой ejemplow, я хочу получить ссылку на настроенный экземпляр ILog от LogManger. Метод GetLogger и помещенный это в быстрый поток достаточно рано для введения его в свойства моих нисходящих объектов.

Таким образом в ответ на одно нетерпеливое предложение, я попробовал, создал нормальный экземпляр ILog каноническим способом:

log4net.Config.XmlConfigurator.Configure();
static readonly log4Net.Ilog Log = LogManager.GetLogger(thatlongassemblyreflectionstuff);

Таким образом, это казалось бы тривиальным (в реальном смысле легких), чтобы теперь добавить, что ссылка на контейнер Единицы и продолжает мою замечательную жизнь.

Однако подпись для метода RegisterInstance хочет 'Тип' не интерфейс.

Для тех, кто не перерыл log4net объектную модель, afficiananderos корректны: l4n является 'оберткой', и Вы не можете получить пристанище фактического 'типа' для штуки Журнала.

Таким образом, теперь я должен протестировать. И Вы знаете то, что это означает, это могло занять минуту, но более вероятно займет час или четыре (similarilties как написания 'часа', и 'четыре' никогда не являются случайными в реальной жизни).

Однако следующее, минус игнорируемая часть о канонической установке, действительно работало:

container
  .RegisterInstance("Logger", Log, new ContainerControlledLifetimeManager())
.RegisterType<IControllerContext, ControllerContext>
(
   "CtlrCtx", 
   new ContainerControlledLifetimeManager(), 
   new InjectionConstructor(new ResolvedParameter<IMessageBuilder>("MsgBldr")),
   new InjectionProperty("Log",new ResolvedParameter<ILog>("Logger"))
);

Так хэш-коды для объекта Журнала orginal и объекта Журнала, введенного в свойство моего marvy мало Объекта контекста, идентичны.

Однако...

Инжекционный процесс потребовал, чтобы я выставил свойство Log Объекта контекста через его интерфейс, подразумевая, что это больше не мог быть статический объект. И ли объект log4net ILog является статическим, кажется, решающий фактор относительно того, является ли это сериализуемым и может быть mashalled между блоками без поразительного 'время выполнения, станет нестабильными' предупреждениями (которые действительно значимы только для Матричных вентиляторов).

Нежелательный, хотя не удержанный, я привык остроту Resharper 'для свойства с отступающим полем' и установил отступающее поле для помех, пока свойство Interface осталось нестатичным. Хорошо это создало, и тест работал зеленый.

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

Таким образом, возможно, это поможет

Спасибо

Stato

5
задан Stato Machino 24 August 2009 в 07:03
поделиться