Я натолкнулся через несколько из этих вопросов, наложение вокруг различных сайтов и ответов, кажется, вращает 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