6

je regardais cela et il répond à la moitié de mes questions:Windsor Castle Constructor interne/classe

Castle Windsor: Register class with internal constructor?

Mais pouvez-vous utiliser Windsor utiliser des constructeurs internes/classe ainsi que l'injection de dépendance? (donc les paramètres du constructeur sont injectés aussi)? Je voudrais garder la classe/constructeur interne pour permettre l'encapsulation optimale (ces classes ne devraient pas être exposées au public).

J'ai besoin pour soutenir cette Silverlight, donc je ne pense pas que ce soit une option:

Castle Windsor: How to register internal implementations

Merci.

+0

IMHO ceci n'est pas une encapsulation optimale. Si vous avez besoin de Windsor pour accéder à ces classes, elles ne sont pas correctement encapsulées. Écris une façade ou rends-les publics. –

+1

Je ne suis pas sûr de comprendre. J'ai une interface publique de service IMyService. Je ne veux pas que l'implémentation soit visible par les consommateurs du service. J'ai donc la classe interne de mise en œuvre MyService: IMyService. Comment ce scénario ne représente-t-il pas l'encapsulation optimale? – Jeff

+0

vous confondez les types internes avec les interfaces. Ce sont des problèmes orthogonaux. –

Répondre

6

Cela peut ne pas être une réponse satisfaisante, mais il est recommandé de créer toutes les classes dont vous avez besoin d'instancier via Castle public, avec des constructeurs publics. Votre conception devrait permettre à une dépendance en aval d'instancier vos objets sans compter sur Castle ou InternalsVisibleTo.

Pour votre question, Castle ne recherchera que les constructeurs publics pour instancier un objet. Je ne crois pas qu'il existe un moyen de le faire rechercher des constructeurs internes ou privés. Cependant, si votre classe est interne, vous pouvez rendre vos constructeurs internes publics sans modifier l'encapsulation. Voir le cas de test suivant:

[TestFixture] 
public class InternalConstructorTests 
{ 
    [Test] 
    public void Test() 
    { 
     using (var container = new WindsorContainer()) 
     { 
      container.Register(
       Component.For<IFoo>().ImplementedBy<Foo>(), 
       Component.For<IBar>().ImplementedBy<Bar>(), 
       Component.For<IBaz>().ImplementedBy<Baz>() 
       ); 
      // fails because Castle can't find, and won't call, the internal constructor 
      Assert.Throws<ComponentActivatorException>(()=>container.Resolve<IFoo>()); 
      // passes because the Baz constructor is public, but the "real" encapsulation 
      // level is the same because the class is internal, effectively making the 
      // public constructor internal as well 
      container.Resolve<IBaz>(); 
     } 
    } 
} 
internal interface IBar{} 
internal class Bar : IBar{} 
internal interface IFoo{} 
internal class Foo : IFoo 
{ 
    internal Foo(IBar bar) 
    { 
    } 
} 
internal interface IBaz { } 
internal class Baz : IBaz 
{ 
    public Baz(IBar bar) 
    { 
    } 
}