еще раз о log4net и конфиге Unity IOC

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

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

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

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

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

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

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

Однако подпись для метода RegisterInstance требует, чтобы «Тип» не являлся интерфейсом.

Для тех, кто не искал объектную модель log4net, afficiananderos верны: l4n - это «обертка», и вы не можете получить информацию о фактическом «типе» для вещица журнала.

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

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

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"))
);

Таким образом, хеш-коды для оригинального объекта Log и объекта Log, введенного в свойство моего маленького объекта Context, идентичны.

Тем не мение...

Процесс внедрения потребовал, чтобы я открыл свойство Log объекта Context через его интерфейс, то есть он больше не мог быть статическим объектом. И то, является ли объект log4net ILog статическим, кажется, решающим фактором относительно того, является ли он сериализуемым и может ли он быть распределен между сборками без драматических предупреждений «время выполнения станет нестабильным» (которые действительно имеют значение только для поклонников Matrix).

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

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

Так что, возможно, это поможет

Спасибо

Stato

Ответы на вопрос(2)

Ваш ответ на вопрос