Puede que esta no sea una respuesta satisfactoria, pero es una práctica recomendada crear todas las clases que necesita para crear una instancia a través de Castle public, con constructores públicos. Su diseño debería permitir una dependencia posterior para crear instancias de sus objetos sin depender de Castle o InternalsVisibleTo.
Para su pregunta, Castle solo buscará constructores públicos para instanciar un objeto. No creo que haya una forma de hacerlo buscar constructores internos o privados. Sin embargo, si su clase es interna, puede hacer que sus constructores internos sean públicos sin cambiar la encapsulación. Consulte el siguiente caso de prueba:
[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)
{
}
}
En mi humilde opinión esto no es una encapsulación óptima. Si necesita que Windsor acceda a estas clases, entonces no están encapsuladas adecuadamente. O escribe una fachada o hazla pública. –
No estoy seguro de entender. Tengo una interfaz pública de servicio IMyService. No quiero que la implementación sea visible para los consumidores del servicio. Así que tengo la clase de implementación interna MyService: IMyService. ¿Cómo este escenario no representa la encapsulación óptima? – Jeff
está confundiendo tipos internos con interfaces. Estos son problemas ortogonales. –