novamente sobre log4net e configuração do Unity IOC

Eu esbarrei em algumas dessas questões espalhadas por vários sites e as respostas parecem ser lidas por l4n officianados em relação ao valor do leve invólucro que o log4net 'é' (você não entende?) E pontos de vista similares fato incompreensível.

No entanto, parece que o que os usuários estão pedindo (e esta é a minha pergunta) é como encaixar o modelo de objeto log4net na sequência registertype / registerinstance na interface de configuração fluente.

O objetivo aqui não seria re-embrulhar l4n, mas simplesmente pegar uma referência decente que não exija seqüestrar o fluxo fluente, por assim dizer.

Ejemplow pobre, eu quero obter uma referência a uma instância configurada de ILog de um método LogManger.GetLogger e colocá-lo no fluxo fluente cedo o suficiente para injetá-lo em propriedades dos meus objetos a jusante.

Então, em resposta a uma sugestão impaciente, eu tentei criar uma instância normal do ILog da maneira canônica:

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

Assim, parece trivial (no sentido real de esforço) adicionar agora essa referência ao recipiente Unity e continuar com minha vida maravilhosa.

No entanto, a assinatura para o método RegisterInstance quer um 'tipo' não uma interface.

Para aqueles que não pesquisaram através do modelo de objeto log4net, os afficiananderos estão corretos: l4n é um 'invólucro' e você não pode obter um holt do 'tipo' real para o item Log.

Então agora eu tenho que testar. E você sabe o que isso significa, pode levar um minuto, mas é mais provável que leve uma ou quatro horas (semelhanças como as grafias de 'hora' e 'quatro' nunca são coincidentes na vida real).

No entanto, o seguinte, menos a parte elidida sobre a configuração canônica, funcionou:

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

Portanto, os hashcodes do objeto Log original e do objeto Log injetados na propriedade do meu objeto Contexto little marvel são idênticos.

Contudo...

O processo de injeção exigia que eu expusesse a propriedade Log do objeto Context por meio de sua interface, o que significava que não poderia mais ser um objeto estático. E se o objeto ILog log4net é estático parece ser o fator decisivo para saber se ele é serializável e pode ser usado entre assemblies sem os dramáticos avisos 'o tempo de execução se tornará instável' (que são verdadeiramente significativos apenas para os fãs do Matrix).

Desencorajado, embora não dissuadido, usei o 'bacana' de Resharper para propriedade com um campo de apoio 'e configurei o campo de apoio para ser estático enquanto a propriedade Interface permaneceu não-estática. Bem, construiu e o teste correu verde.

Então eu até fiz uma reconstrução e funcionou. Então, talvez, quando isso explodir nos testes de integração, eu escaparei do debacle log4net não serializável.

Então talvez isso ajude

obrigado

Stato

questionAnswers(2)

yourAnswerToTheQuestion