Resolviendo clases sin registrarlas usando Castle Windsor

Tome el siguiente progtwig inútil:

class Program { static void Main(string[] args) { IUnityContainer unityContainer = new UnityContainer(); IWindsorContainer windsorContainer = new WindsorContainer(); Program unityProgram = unityContainer.Resolve(); Program castleProgram = windsorContainer.Resolve(); } } 

El UnityContainer me devolverá una instancia de Progtwig, mientras que el contenedor de Windsor lanzará una ComponentNotFoundException.

Puedo ver argumentos para ambos comportamientos y no me importa con lo que termine, sin embargo Prism V2 Drop 8 (la última al momento de escribir) se basa internamente en el comportamiento de Unity, solicitando clases que no se han registrado.

En lugar de buscar y registrar todas estas clases para Prism, preferiría que Windsor se comportara como Unidad. No he encontrado nada en google que me ayude a hacer esto (aunque mi terminología puede ser incorrecta) y la documentación de Windsor es bastante mala …

¿Alguien puede sugerir una solución a este problema?

Windsor actualmente no lo admite, y es por diseño. El razonamiento es que debe registrar explícitamente los tipos que necesita para no tener un objeto mal configurado.

Sin embargo, existe la posibilidad de que se agregue un gancho para crear un tipo no registrado en algún momento en el futuro cercano, ya que esto es necesario para la instalación de integración de WCF. (Editar – se agregó en v2.1 – echa un vistazo a ILazyComponentLoader s)

De todos modos , independientemente de los cargadores de componentes perezosos, lo mejor que puede hacer es usar una API fluida para registrar por lotes todos los tipos de un conjunto que coincida con los criterios necesarios por adelantado. No es mucho más código y dormirás mejor por las noches.

Use los cargadores perezosos solo si realmente no tiene suficiente información al inicio (en su raíz de composición ) para determinar qué componentes necesitará.

Windsor no es compatible con esto de manera inmediata, pero puede crear métodos de extensión para hacer esto:

 static class WindsorExtensions { public static object ResolveType(this IWindsorContainer container, Type type) { if ( type.IsClass && !container.Kernel.HasComponent(type) ) container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient); return container.Resolve(type); } public static T ResolveType(this IWindsorContainer container) { return (T)ResolveType(container, typeof(T)); } } class Program { static void Main(string[] args) { IUnityContainer unityContainer = new UnityContainer(); IWindsorContainer windsorContainer = new WindsorContainer(); Program unityProgram = unityContainer.Resolve(); Program castleProgram = windsorContainer.ResolveType(); } } 

Krzysztof no tengas miedo de vincular a tu propio blog aquí 🙂 http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx

Además, encontré esta implementación simple útil en mi aplicación WPF, eliminé el contraint de cadena y estás cerca del caso general

 public class ViewModelLoader : Castle.MicroKernel.Resolvers.ILazyComponentLoader { public IRegistration Load(string key, Type service) { if (service == null) return null; if (service.Name.EndsWith("ViewModel", StringComparison.CurrentCultureIgnoreCase)) return Component.For(service).Named(key); else return null; } }