c# - tutorial - Castle Windsor: ¿hay una manera de validar el registro sin una llamada de resolución?
castle.net core (1)
Mi comprensión actual del registro de Castle Windsor es que solo se puede validar el registro llamando a Resolver en un componente raíz. Pero como el modelo de componentes de windsor conoce las dependencias de cada componente, debería ser posible probar que todas las dependencias pueden satisfacerse sin instanciar realmente nada. La razón principal para querer hacer esto es tener una prueba de unidad para el registro que no requiera que apague componentes que llaman a recursos externos en el inicio.
Por ejemplo. Tengo una raíz de clase que depende de IChild:
public class Root : IRoot
{
private IChild child;
public Root(IChild child)
{
this.child = child;
}
}
Si registro Root como IRoot, pero no registro un IChild. Cuando llamo a resolver así:
var container = new WindsorContainer().Register(
Component.For<IRoot>().ImplementedBy<Root>()
);
container.Resolve<IRoot>();
Me sale un error:
MyNamespace.Root is waiting for the following dependencies:
Services:
- MyNamespace.IChild which was not registered.
¿Hay algo como:
container.TestResolve<IRoot>();
Eso guiaría el gráfico de dependencia y verificaría que todas las dependencias puedan satisfacerse, pero ¿cuál de ellas no ejemplifica nada?
OK, es posible. Gracias a Krzysztof Koźmic por mostrarme cómo. No es inmediatamente obvio, pero puede usar el subsistema de diagnóstico de Windsor para plantear problemas potenciales con el registro. He reunido un pequeño método estático que se lanza si hay algún componente mal configurado:
private static void CheckForPotentiallyMisconfiguredComponents(IWindsorContainer container)
{
var host = (IDiagnosticsHost)container.Kernel.GetSubSystem(SubSystemConstants.DiagnosticsKey);
var diagnostics = host.GetDiagnostic<IPotentiallyMisconfiguredComponentsDiagnostic>();
var handlers = diagnostics.Inspect();
if (handlers.Any())
{
var message = new StringBuilder();
var inspector = new DependencyInspector(message);
foreach (IExposeDependencyInfo handler in handlers)
{
handler.ObtainDependencyDetails(inspector);
}
throw new MisconfiguredComponentException(message.ToString());
}
}
Puedes usarlo así:
var container = new WindsorContainer().Register(
Component.For<IRoot>().ImplementedBy<Root>()
);
CheckForPotentiallyMisconfiguredComponents(container);
En este caso, obtengo una excepción de componente mal configurada con este mensaje:
''WindsorSpikes.Root'' is waiting for the following dependencies:
- Service ''WindsorSpikes.IChild'' which was not registered.
WindsorSpikes.MisconfiguredComponentException:
''WindsorSpikes.Root'' is waiting for the following dependencies:
- Service ''WindsorSpikes.IChild'' which was not registered.
Consulte la documentación del castillo para obtener más detalles sobre el subsistema de diagnóstico:
http://stw.castleproject.org/Default.aspx?Page=Debugger-views&NS=Windsor