6

Stiamo valutando contenitori IoC per progetti C# e sia Unity sia Castle.Windsor si distinguono. Una cosa che mi piace di Unity (anche NInject e StructureMap lo fanno) sono quei tipi in cui è ovvio come costruirli non devono essere registrati con il contenitore IoC.Can Castle.Windsor esegue la risoluzione automatica dei tipi di calcestruzzo

C'è un modo per farlo in Castle.Windsor? Sono onesto con Castle.Windsor per dire che non lo fa? Esiste una ragione di progettazione per non farlo deliberatamente, o è una svista, o semplicemente non visto come importante o utile?

Sono a conoscenza di container.Register(AllTypes... a Windsor, ma non è proprio la stessa cosa. Non è completamente automatico ed è molto ampio.

Per illustrare il punto, qui ci sono due test NUnit che fanno la stessa cosa tramite Unity e Castle.Windsor. The Castle.Windsor si fallisce. :

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

possibile duplicato di [Risolvere le classi senza registrarle utilizzando Castle Windsor] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima

risposta

5

Windsor non supporta questo fuori dalla scatola, e questa è una decisione deliberata.

Tuttavia, la versione del trunk può essere facilmente estesa per supportare questo scenario registrando in modo lento i componenti non registrati, come richiesto. Dovrai implementare l'interfaccia ILazyComponentLoader, che occuperà come 5 righe di codice. Vedere here per un esempio.

+1

Puoi discutere pensando dietro la decisione? Sembra avere dei vantaggi, quindi devi aver visto costi maggiori. Assumerei che le registrazioni implicite avrebbero uno stile di vita transitorio, ma forse quell'assunzione è solo un'ipotesi ed è aperta alla confusione. – Anthony