6

Nous évaluons les conteneurs IoC pour les projets C#, et Unity et Castle.Windsor se démarquent. Une chose que j'aime à propos de Unity (NInject et StructureMap aussi) est que les types où il est évident de savoir comment les construire ne doivent pas être enregistrés avec le conteneur IoC.Can Castle.Windsor fait la résolution automatique des types de béton

Y a-t-il un moyen de le faire dans Castle.Windsor? Suis-je juste à Castle.Windsor de dire que ça ne fait pas ça? Y a-t-il une raison de conception de délibérément ne pas le faire, ou est-ce un oubli, ou tout simplement pas vu comme important ou utile?

Je connais le container.Register(AllTypes... à Windsor, mais ce n'est pas tout à fait la même chose. Ce n'est pas entièrement automatique, et c'est très large. Pour illustrer le point, voici deux tests NUnit qui font la même chose via Unity et Castle.Windsor. Le château. Un échec échoue. :

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

duplication possible de [Résoudre des classes sans les enregistrer en utilisant Castle Windsor] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima

Répondre

5

Windsor ne supporte pas ce hors de la boîte, et c'est une décision délibérée. Cependant, la version de ligne peut être facilement étendue pour prendre en charge ce scénario en enregistrant paresseusement des composants non enregistrés, comme ils sont demandés. Vous devrez mettre en œuvre l'interface ILazyComponentLoader, qui prendra comme 5 lignes de code. Voir here pour un exemple.

+1

Pouvez-vous discuter du penser derrière la décision? Cela semble avoir des avantages, alors vous devez avoir vu des coûts plus élevés. Je suppose que les enregistrements implicites auraient un mode de vie transitoire, mais peut-être que cette supposition n'est qu'une supposition et qu'elle prête à confusion. – Anthony

Questions connexes