Castle.Windsor: resolução opcional do componente de uma fábrica digitada
Eu tenho uma instalação de serviço WCF com Castle.Windsor; As mensagens chegam a um expedidor que as envia ao componente certo (basicamente umIHandler<Message>
com a mensagem sendo uma consulta).
No entanto, em alguns casos, há um adicional antes que o manipulador possa agir; a mensagem deve ser concluída com dados provenientes de outro local. O que eu quero é verificar se existe um injetor para o tipo de minha mensagem e, se existir, execute-o.
IInjector<Message> Injector = InjectorFactory.RetrieveInjector<Message>();
if (Injector != null)
{
Logger.InfoFormat("IInjector<{0}> OK", input.GetType().Name);
Injector.InjectCode(input, "Data coming from somewhere else");
}
O raciocínio por trás disso é que, em algum momento futuro, alguém poderá criar um plugin com umIInjector<Message>
e quero buscá-lo no futuro; mas no momento não existe.
É possível ter uma fábrica digitada retornando nulo quando um componente não é encontrado em vez de lançar umComponentNotFoundException
?
EDITAR
Como discutido com @Steven, responderei minha própria pergunta para compilar o que me levou à solução e à resolução que encontrei. Primeiro vamos reafirmar o problema
Eu tenho um serviço WCF basicamente seguindo a estrutura descrita por Krzysztof KoĹşmic emEste artigo
No entanto, antes de chamar os manipuladores, eu queria ter uma operação opcional em que a mensagem recebida fosse modificada, se necessário.
private static void DoActualWork<T>(T command)
{
IInjector<T> Injector = injectorFactory.GetInjector<T>();
if (Injector != null) { Injector.InjectThings(command, ""); }
var handlers = factory.GetHandlersForCommand(command);
foreach (var handler in handlers)
{
handler.Execute();
}
}
Eu estava tendo um problema com o injectorFactory; quando eu pedi para encontrar um componente inexistente, jogaria umComponentNotFoundException
. O que eu gostaria é que a fábrica reconheça que não havia nenhum componente e simplesmente retorne um valor nulo.