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)
{
}
}
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. –
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
vous confondez les types internes avec les interfaces. Ce sont des problèmes orthogonaux. –