6

Estamos evaluando contenedores IoC para proyectos C#, y tanto Unity como Castle.Windsor se destacan. Una cosa que me gusta de Unity (NInject y StructureMap también lo hacen) es que los tipos en los que es obvio cómo construirlos no tienen que registrarse en el IoC Container.Can Castle.Windsor hacer la resolución automática de los tipos de hormigón

¿Hay alguna manera de hacer esto en Castle.Windsor? ¿Estoy siendo justo con Castle.Windsor para decir que no hace esto? ¿Hay una razón de diseño para deliberadamente no hacer esto, o es un descuido, o simplemente no se considera importante o útil?

Soy consciente de container.Register(AllTypes... en Windsor, pero eso no es exactamente lo mismo. No es completamente automático, y es muy amplio.

Para ilustrar el punto, aquí hay dos pruebas de NUnit que hacen lo mismo a través de Unity y Castle.Windsor. El Castle.Windsor falla. :

namespace SimpleIocDemo 
{ 
    using NUnit.Framework; 
    using Castle.Windsor; 
    using Microsoft.Practices.Unity; 

    public interface ISomeService 
    { 
     string DoSomething(); 
    } 

    public class ServiceImplementation : ISomeService 
    { 
     public string DoSomething() 
     { 
      return "Hello"; 
     } 
    } 

    public class RootObject 
    { 
     public ISomeService SomeService { get; private set; } 

     public RootObject(ISomeService service) 
     { 
      SomeService = service; 
     } 
    } 

    [TestFixture] 
    public class IocTests 
    { 
     [Test] 
     public void UnityResolveTest() 
     { 
      UnityContainer container = new UnityContainer(); 
      container.RegisterType<ISomeService, ServiceImplementation>(); 
      // Root object needs no registration in Unity 
      RootObject rootObject = container.Resolve<RootObject>(); 
      Assert.AreEqual("Hello", rootObject.SomeService.DoSomething()); 
     } 

     [Test] 
     public void WindsorResolveTest() 
     { 
      WindsorContainer container = new WindsorContainer(); 
      container.AddComponent<ISomeService, ServiceImplementation>(); 

      // fails with exception "Castle.MicroKernel.ComponentNotFoundException: 
      // No component for supporting the service SimpleIocDemo.RootObject was found" 
      // I could add 
      // container.AddComponent<RootObject>(); 
      // but that approach does not scale 
      RootObject rootObject = container.Resolve<RootObject>(); 
      Assert.AreEqual("Hello", rootObject.SomeService.DoSomething()); 
     } 
    } 
} 
+0

posible duplicado de [Resolviendo clases sin registrarlas usando Castle Windsor] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima

Respuesta

5

Windsor no es compatible con esto de la caja, y esta es una decisión deliberada.

Sin embargo, la versión troncal se puede ampliar muy fácilmente para admitir este escenario registrando perezosamente los componentes no registrados, según se soliciten. Tendrá que implementar la interfaz ILazyComponentLoader, que ocupará como 5 líneas de código. Ver here para un ejemplo.

+1

¿Puede discutir el pensando detrás de la decisión? Parece tener un beneficio, por lo que debe haber visto mayores costos. Asumiría que los registros implícitos tendrían un estilo de vida transitorio, pero tal vez esa suposición sea solo una suposición y esté abierto a la confusión. – Anthony

Cuestiones relacionadas